Opcjonalny jest ustawiony lub nieustawiony (nie zerowy lub nie) ... pozostawiając nam ważną decyzję. „Jak napisać nasz kod, aby działał poprawnie w dwóch stanach?”. Decyduje o tym sposób, w jaki rozpakujemy opcjonalne.
Istnieje kilka podejść, których można użyć, aby przeciwdziałać nie ustawionemu opcjonalnemu.
- Wypadek!
- Domyślnie wartość na coś - jeśli nie została ustawiona.
- Wdzięcznie zawieść, tj. Nic nie rób, ale także jeśli wartość została ustawiona, przypisz ją.
- Z wdziękiem niepowodzenie, tj. Nic nie rób, ale jeśli wartość została ustawiona ... zrób coś (to po prostu więcej niż jedno przypisanie).
Poniżej znajdują się 4 podejścia
Używanie wymuszonego rozpakowywania spowoduje awarię, jeśli nie masz wartości. Chciałbyś to zrobić, jeśli posiadanie tej wartości ma kluczowe znaczenie, np. Tytuł filmu (każdy film MUSI mieć nazwę). !służy do wymuszonego rozpakowywania.
movieTitle = movie.title!
Użycie koalescencji zerowej to kolejny sposób, który da ci większą kontrolę , co oznacza, że nie ulegnie awarii, jeśli wartość nie zostanie ustawiona, ani nie `` nic nie ustawi '', jeśli nie jest ustawiona ... zrobi to, co powiesz by to zrobić, np. domyślnie / ustawiłoby nazwę filmu na untitled_movie, gdyby nie ustawiono nazwy. ??służy do koalescencji zerowej.
var movieTitle = movie.title ?? "untitled_Movie"
Używanie opcjonalnego łączenia łańcuchowego nic nie da, jeśli nie masz wartości, i ustawi wartość, jeśli masz wartość. Robisz to dla czegoś, dla czego ustalenie wartości nie jest istotne, np. Dla nazwiska agenta twojego aktora . ?służy do opcjonalnego łączenia w łańcuch.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
Użycie if-let(lub guardktóre są dwoma różnymi typami opcjonalnego wiązania ) zapewni większą kontrolę , nie ulegnie awarii, jeśli wartość nie zostanie ustawiona. Jeśli wartość jest ustawiona, możesz coś zrobić. Jeśli nie jest ustawiona, możesz dodać elseinstrukcję.
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
Jest to najczęściej stosowany sposób rozpakowywania, ponieważ wymuszone rozpakowywanie jest nieco odradzane. Więcej dyskusji na temat tego, dlaczego odradza się, można znaleźć tutaj . Aby uzyskać dobre porównanie między guardi if-letzobaczguard vs. if-let
Dygresja:
Opcjonalne wiązanie i opcjonalne łączenie łańcuchowe są powszechnie używane razem:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}