Widziałem ten kod w witrynie Swift i różnych postach tutaj i próbuję uchwycić podstawy. Jak oceniana jest ta linia?
if let name = optionalName {
Jestem zdezorientowany, ponieważ to nie jest nazwa == opcjonalna nazwa, przypisuje wartość, więc w jaki sposób to zgłasza prawdę i dlaczego nie jest prawdą, gdy zamieniasz na nil z John Appleeed, skoro nadal będzie równy?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
źródło
źródło
if let
składnia jest znana jako opcjonalne wiązanie.Odpowiedzi:
Zasadniczo wiersz mówi: „jeśli możesz pozwolić nowej zmiennej
name
równać się nieopcjonalnej wersjioptionalName
, wykonaj z nią następujące czynności”. Jak zauważył Martin, nazywa się to opcjonalnym wiązaniem .Jego jedynym celem jest sprawdzenie, czy zmienna opcjonalna zawiera rzeczywistą wartość i powiązanie formy nieopcjonalnej ze zmienną tymczasową. Jest to bezpieczny sposób „rozpakowania” elementu opcjonalnego lub innymi słowy, uzyskania dostępu do wartości zawartej w opcjonalnym. W żaden sposób nie jest to próba jakiejkolwiek równości. To tylko testowanie istnienia wartości w opcjonalnym.
źródło
if let
wartość ze zmienną nieobowiązkową (name
w tym przykładzie). Twój przykład nie skompilowałby się, ponieważ teraz nie ma wywoływanej zmiennejname
. Jeśli zmienisz przykład, abyoptionalName
go używać , zostanie wydrukowany jakoHello, Optional("John Appleseed")
. Możesz użyć wymuszonego rozpakowywania po sprawdzeniu wartości nil,Hello, \(optionalName!)
ale jest to po prostu bardziej podatne na błędy, jeśli przeniesiesz tę sekcję kodu gdzieś bez sprawdzania.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.
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.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 //would not crash if you don't have a lead actor (optional chaining) let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)
Użycie
if-let
(lubguard
któ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ćelse
instrukcję.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
guard
iif-let
zobaczguard 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 } // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
źródło
Składnia if akceptuje 2 różne warunki. Drugie, opcjonalne wiązanie, nie jest wartością logiczną. To jest mylące, jak możesz napisać:
if let name = optionalName {
ale nie
if (let name = optionalName) {
Dokumentacja Apple (odniesienie do Swift):
źródło
if
przyjmuje tylko wyrażenia boolowskie, poza tym, że zwróciłby błąd, więc ten fragment kodu mówiif let name = optionalName { }else{ }
jeśli opcjonalna nazwa ma wartość nil, to warunek jest fałszywy i instrukcja w przeciwnym razie zostanie wykonana. Jednakże, jeśli optionalName ma jakąś wartość, to opcjonalna wartość jest rozpakowywana / przypisywana do stałej zmiennej, tj. Nazwa.
źródło
Ilekroć pracujesz ze słabymi odwołaniami, opcjonalnymi typami lepiej byłoby użyć jeśli pozwolą chronić twój kod i uniknąć awarii Oto przykłady
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
źródło