Swift (Enums VS Structures VS Classes)

Z objektivního pozadí c byl pro mě docela zřejmý rozdíl mezi komponenty jako výčty, třídy a struktury: Enum je množina pojmenovaných hodnot, Struktura je strukturovaný datový typ a třída Class nám samozřejmě umožňuje vytvářet objekty se všemi Věci související s POO.

Když jsem se poprvé začal učit Swift, bylo to trochu matoucí. Protože někdy mohou vypadat podobně. Struktury lze nalézt rychle, pokud byly v některých jiných jazycích použity pouze třídy.

  • Například: Výčty a struktury mohou mít také metody nebo konstruktéry.

Osobně jsem potřeboval nějaký čas, abych se rychle seznámil s rozšířenými funkcemi, které máme se strukturami a výčty.

Takže abyste věděli, kde použít každý z nich. je důležité mít jasnou představu o tom, co odlišuje člověka od druhého. Zkusme je tedy projít jeden po druhém.

Referenční typy a typy hodnot

Klíčový rozdíl mezi třídami z jedné strany a výčty a struktury z druhé. Je to, že třídy jsou referenční typy, zatímco výčty a struktury jsou typy hodnot.

Což znamená, že přiřadíte objekt typu třídy jinému. Stali se
ukázal na stejnou instanci. Proto, když je jeden upraven, modifikace se použije na druhou:

třída Cat {
   název var: String
   init (jméno: String) {
      self.name = jméno
   }
}
var cat1 = Kočka (jméno: "Kitty")
var cat2 = cat1
cat1.name = "Oscar"
// Obě kočky jsou stejné
print ("jméno cat1: \ (cat1.name), jméno cat2: \ (cat2.name)")
// cat1 name: Oscar, cat2 name: Oscar

zatímco pro struktury a výčty se při každém přiřazení vytvoří nová kopie:

struct Cat {
název var: String
}
var cat1 = Kočka (jméno: "Kitty")
var cat2 = cat1
cat1.name = "Oscar"
print ("jméno cat1: \ (cat1.name), jméno cat2: \ (cat2.name)")
// cat1 name: Oscar, cat2 name: Kitty

Proměnlivost

Skutečnost, že struktury a výčty jsou typy hodnot, má kromě přiřazení nějaké další vedlejší účinky.

Když je struktura vytvořena jako konstanta (pomocí let), je celá instance neměnná. Což znamená, že nemůžeme měnit jeho vlastnosti:

struct Cat {
    název var: String
}
let cat1 = Cat (jméno: "Kitty")
cat1.name = "Oscar"
// chyba: nelze přiřadit k vlastnosti

Ale pro třídy. I když je to konstanta, nemění se pouze reference. zatímco vlastnosti lze bez problémů upravit:

třída Cat {
    název var: String?
}
nechat cat1 = Cat ()
cat1.name = "Oscar"
// Funguje dobře

I když je deklarována jako proměnná (var), struktura se nemůže sama upravit. a proto musíme použít mutující klíčové slovo. která není k dispozici pro třídy:

struct Cat {
   soukromá var vakcína: Bool
   init () {
      self.init ()
   }
   // Nebude fungovat bez mutace klíčového slova
   mutující func vakcinát () {
      self.vaccinated = true
   }
}
var cat1 = Cat ()
cat1.vaccinate ()

Deinitializér

Při použití metody init pro hodnoty i referenční typy. deinit metoda neexistuje pro typy hodnot. s vědomím, že se jich netýká referenční počet:

struct Cat {
   název var: String
   deinit {
   }
}
// Chyba kompilátoru: Deinitializéry mohou být deklarovány pouze v rámci třídy

Generovaný init

Možnost je možná pouze u struktur. „Generované iniciační metody“, které jsou založeny na vlastnostech:

struct Cat {
název var: String
var věk: Int
}
let cat1 = Cat (jméno: "Lucy", věk: 3)

Dědictví

Také si všimněte, že dědičnost podporuje pouze třídy:

struct Pet {
     název var: String
}
struct Cat: Pet {
}
// CHYBA: Dědičnost z typu protokolu „Pet“

Uložené vlastnosti

Na rozdíl od tříd a struktur nemůže výčet obsahovat uloženou vlastnost:

enum Pet {
    
    název var: String
// error: enums nesmí obsahovat uložené vlastnosti
}

Závěr

Nakonec můžeme říci, že struktury se používají tam, kde chceme reprezentovat datovou strukturu. Hlavně modely. Zatímco třídy se používají ve většině ostatních případů.

Můžete si také všimnout, že struktury jsou považovány za bezpečné. Vzhledem k jejich hodnotové povaze.

Děkuji za přečtení. A doufám, že jste to považovali za užitečné