Swift 101 - Práce s novými volitelnými hodnotami Swift

Programovací jazyk Swift má novou funkci nazvanou volitelné doplňky, které nebyly dříve dostupné v Objective-C. Jsou podobné volitelným typům v jazyce Java a nulovatelným typům v programovacím jazyce C #.

Proč používat volitelné doplňky?

Možná si myslíte, že „mohu ignorovat volitelné volby - je to funkce, kterou nikdy nebudu používat“, ale doporučuji, abyste si přečetli další informace. Zjistíte, že musíte použít volby v Swift, pokud někdy potřebujete hodnotu nula!

Volitelné hodnoty ve službě Swift vám umožní být přesnější ve vašem kódu tím, že vám umožní určit, kdy je v pořádku, aby byla určitá hodnota prázdná (a když to není!) To vám pomůže vyhnout se běžným programovým chybám, ke kterým dochází v aplikaci, když se setká neočekávaná hodnota nil.

Volby Swift také pomáhají kódu vaší aplikace lépe odrážet schopnost, kterou již máte v základních datech, což znamená, že určitý atribut entity je nepovinný. Jak je znázorněno na obrázku 1, můžete zadat typ atributu (String, v tomto případě) a také označit, zda je hodnota volitelná.

Obrázek 1 - Můžete určit, že atribut Core Data entity je volitelný.

Nyní vám Swift umožňuje udělat totéž s vlastnostmi a proměnnými. Zde je ekvivalentní nepovinné prohlášení v aplikaci Swift:

var middleName: String?

Toto prohlášení vytvoří proměnnou s názvem middleName typu String . Otazník ( ? ) Za typem proměnné String označuje, že proměnná middleName může obsahovat hodnotu, která může být buď String nebo nil . Každý, kdo se dívá na tento kód, okamžitě ví, že middleName může být nula . Je to samo dokumentující!

Pokud nezadáte počáteční hodnotu pro volitelnou konstantu nebo proměnnou (jak je ukázáno výše), hodnota se automaticky nastaví na nulu . Pokud chcete, můžete počáteční hodnotu explicitně nastavit na nulu:

var middleName: String? = nil

Podívejme se nyní blíže na to, jak se v Swiftu používá nula .

nula v Swift

Na první pohled to nemusí být zřejmé, ale pouze volitelné mohou být nulové . Jak je uvedeno v knize Apple Swift Programming Language (k dispozici zdarma v obchodě iBooks):

nil nelze použít s volitelnými konstantami a proměnnými. Pokud konstanta nebo proměnná ve vašem kódu musí být schopna vyrovnat se s nepřítomností hodnoty za určitých podmínek, vždy ji deklarujte jako volitelnou hodnotu příslušného typu.

To znamená, že nemůžete udělat něco takového, protože proměnná firstName není označena otazníkem, což znamená, že je volitelná:

var firstName: String = nil

Tento kód vytvoří následující chybu kompilace:

Typ 'String' neodpovídá protokolu 'NilLiteralConvertible' .

Je také důležité poznamenat, že nula v Swift je jiná než nula v Objective-C. V Objective-C je nil ukazatel na neexistující objekt. V Swift, nil prostě ukazuje nepřítomnost hodnoty - to není ukazatel. To znamená, že můžete zadat volby libovolného typu, nikoli pouze typy objektů.

Přístup k volitelným hodnotám

Na rozdíl od jiných programovacích jazyků nelze v aplikaci Swift přistupovat k volitelné hodnotě přímo . Musíte nejprve rozbalit volitelný první přístup k jeho podkladové hodnotě. Vezměte například následující kód:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: Řetězec

firstAndMiddleNames = firstName + "" + middleName

První tři řádky kódu deklarují proměnnou firstName String, volitelnou String proměnnou middleName a řetězcovou proměnnou firstAndMiddleNames String. Další řádek kódu zřetězí (spojí) hodnoty proměnné firstName a middleName spolu s mezerou mezi nimi. Možná budete překvapeni, že tento řádek kódu vygeneruje následující chybu kompilace:

Hodnota volby typu 'String?' nevybalené; chtěli jste použít '!' nebo „?“?

To je jeden z Swiftových ochranných mechanismů. To vás nutí uznat, že hodnota může být nula . Jak tedy rozbalíte volitelný? Existují dva hlavní způsoby popsané v následujících částech.

Použití vynuceného rozbalení pro volitelné doplňky

Jak navrhla chyba kompilátoru v předchozí části, jedním ze způsobů, jak rozbalit volitelnou hodnotu, je použít vykřičník (!) Za volitelným příslušenstvím k jeho explicitnímu rozbalení. Například:

firstAndMiddleNames = firstName + " " + middleName!

To manuálně vynutí volitelnou hodnotu middleName, aby bylo rozbaleno. Však Pokud middleName obsahuje nil v době spuštění, bude to způsobit chybu spuštění EXC_BAD_INSTRUCTION . Zřejmě byste nechtěli použít nucené rozbalení, pokud si nejste zcela jisti, že hodnota není nulová .

Použití volitelných vazeb k odbalení volitelných součástí

Můžete použít techniku ​​známou jako volitelná vazba pro testování, zda volitelná obsahuje hodnotu, a pokud ano, uložte tuto hodnotu do dočasné proměnné nebo konstanty. Chcete-li ukázat, jak to funguje s naším předchozím příkladem, podívejte se na tento kód:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: Řetězec

pokud nechat uprostřed = middleName

{

firstAndMiddleNames = firstName + "" + střední

}

jiný

{

firstAndMiddleNames = firstName

}

Pokud je podmínka if kontrolována v době běhu, pokud proměnná middleName obsahuje hodnotu String, podmínka je vyhodnocena jako true, hodnota obsažená v proměnné middleName je nerozbalena, uložena ve střední konstantě a kód v složených závorkách příkazu if je proveden.

Pokud proměnná middleName obsahuje nil, podmínka se vyhodnocuje jako false, nepovinná hodnota se nerozbalí a provede se kód v složených závorkách příkazu else .

Implicitně nerozbalené volitelné doplňky

Swift má také něco, co se nazývá implicitně nerozbalené volitelné. Jedná se o volby, které není třeba rozbalit pomocí nuceného rozbalení (!) Nebo volitelné vazby, protože jsou implicitně rozbaleny (automaticky). Oni jsou deklarováni používat vykřičník (!) Spíše než otazník (?).

Při práci se zásuvkami rozhraní Interface Builder (vlastnosti IBOutlet ) často vidíte implicitně rozbalené doplňky. Například:

@IBOutlet weak var lblDescription: UILabel!

Vlastnost lblDescription má v tomto kódu za ní vykřičník, který označuje, že je implicitně rozbalen. To vám umožní přístup k vlastnosti bez rozbalení.

V tomto příkladu není zaručeno, že vlastnost výstupu nebude obsahovat odkaz na štítek, ale absolutně by měla . Pokud neobsahuje odkaz na štítek, znamená to, že spojení mezi vývodem a štítkem bylo přerušeno. V takovém případě je v pořádku mít chybu při běhu, protože chcete vědět, že je spojení přerušeno, abyste jej mohli opravit!

Je zřejmé, že v případech, kdy si nejste 100% jisti, že konstanta nebo proměnná obsahuje hodnotu, měli byste místo toho použít pravidelný volitelný.

Závěr

Volby jsou skvělou novinkou funkce Swift, která vám umožní bezpečně zpracovávat hodnoty nil v aplikacích iOS. Doporučuji, abyste tento příspěvek několikrát zkontrolovali, abyste se ujistili, že rozumíte základním pojmům, a pak se vraťte zpět do knihy Apple's Swift Programming Language, abyste se dozvěděli více o tom, jak se v systému Swift používají volby.