Czytałem o Optionals w Swift i widziałem przykłady, w których if let
jest używany do sprawdzania, czy Argument opcjonalny przechowuje wartość, a jeśli tak - zrób coś z nieopakowaną wartością.
Jednak widziałem, że w Swift 2.0 słowo kluczowe guard let
jest używane głównie. Zastanawiam się, czy if let
został usunięty ze Swift 2.0, czy nadal można go używać.
Czy powinienem zmienić programy, które zawierają if let
na guard let
?
źródło
if let
gdynon-nil
sprawa jest ważna. Użyj,guard
gdynil
przypadek przedstawia jakiś rodzaj błędu.guard
jest to właściwe, nawet jeśli nie ma błędu. Czasami oznacza to po prostu, że nie ma nic do zrobienia. Na przykładpositionTitle
metoda możeguard if let title = title else {return}
. Tytuł może być opcjonalny, w takim przypadku nie jest to błąd. Aleguard let
nadal jest odpowiednie.if let
jest widoczna tylko wif let
zasięgu. Zmienna związanaguard let
jest później widoczna. Dlatego sensowne jest używanie guard do wiązania wartości opcjonalnych.Straż może poprawić przejrzystość
Kiedy używasz strażnika, masz znacznie większe oczekiwania, że strażnik odniesie sukces i jest dość ważne, że jeśli to się nie powiedzie, po prostu chcesz wcześniej wyjść z lunety . Tak jak Ty pilnujesz, aby sprawdzić, czy plik / obraz istnieje, czy tablica jest pusta, czy nie.
Jeśli napiszesz powyższy kod za pomocą if-let, przekaże on programiście czytającemu, że jest to bardziej 50-50. Ale jeśli używasz guard, dodajesz klarowności do swojego kodu i oznacza to, że spodziewam się, że to zadziała w 95% przypadków ... jeśli kiedykolwiek się nie powiedzie, nie wiem, dlaczego miałoby to działać; jest to bardzo mało prawdopodobne ... ale zamiast tego po prostu użyj tego domyślnego obrazu lub po prostu potwierdź za pomocą sensownej wiadomości opisującej, co poszło nie tak!
Również w wyniku powyższych sugestii i czystego kodu jest bardziej prawdopodobne, że będziesz chciał / musiał dodać potwierdzenia do nieudanych instrukcji ochrony, po prostu poprawia czytelność i wyjaśnia innym programistom, czego się spodziewasz.
(nie będziesz używać potwierdzeń / warunków wstępnych dla
if-let
s. To po prostu nie wydaje się właściwe)Korzystanie ze strażników pomaga również zwiększyć przejrzystość, omijając piramidę zagłady. Zobacz odpowiedź Nitina .
Guard tworzy nową zmienną
Jest jedna ważna różnica, której moim zdaniem nikt dobrze nie wyjaśnił.
Jednak oba
guard let
iif let
rozpakuj zmiennąWraz z
guard let
tobą tworzysz nową zmienną, która będzie istniała pozaelse
instrukcją.Ze
if let
ty nie tworzysz każdy nowy zmiennej po else, wystarczy tylko wprowadzić blok kodu jeśli opcjonalny nie jest zerowe. Nowo utworzona zmienna istnieje tylko wewnątrz bloku kodu, a nie po!guard let:
if-let:
Aby uzyskać więcej informacji
if let
, zobacz: Dlaczego ponowna deklaracja opcjonalnego powiązania nie powoduje błęduOchrona wymaga wyjścia z lunety
(Wspomniane również w odpowiedzi Roba Napiera):
MUSISZ
guard
zdefiniować wewnątrz func. Jego głównym celem jest przerwanie / powrót / wyjście z zakresu, jeśli warunek nie jest spełniony:Na
if let
nie trzeba go mieć w środku każdej func:guard
vsif
Warto zauważyć, że jest to bardziej właściwe, aby zobaczyć jak to pytanie
guard let
vsif let
iguard
kontraif
.Samodzielny
if
nie rozpakowuje się, podobnie jak samodzielnyguard
. Zobacz przykład poniżej. Nie kończy się wcześniej, jeśli wartość tonil
. Brak wartości opcjonalnych. Po prostu wychodzi wcześnie, jeśli warunek nie jest spełniony.źródło
Kiedy
if-let
i kiedy używać,guard
często zależy od stylu.Powiedzmy, że masz
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
i opcjonalną tablicę elementów (var optionalArray: [SomeType]?
), i musisz zwrócić albo0
jeśli tablica jestnil
(nie jest ustawiona), albocount
jeśli tablica ma wartość (jest ustawiona).Możesz to zaimplementować w ten sposób, używając
if-let
:lub w ten sposób używając
guard
:Przykłady są funkcjonalnie identyczne.
Gdzie
guard
naprawdę błyszczy jest, gdy masz zadanie jak sprawdzanie poprawności danych, a chcesz funkcja niepowodzenie wcześnie, jeśli coś jest nie tak.Zamiast zagnieżdżać kilka elementów w
if-let
miarę zbliżania się do zakończenia walidacji, „ścieżka sukcesu” i teraz pomyślnie powiązane opcje znajdują się w głównym zakresie metody, ponieważ wszystkie ścieżki błędów już wróciły.źródło
Spróbuję wyjaśnić użyteczność instrukcji guard za pomocą (niezoptymalizowanego) kodu.
Masz interfejs użytkownika, w którym weryfikujesz pola tekstowe do rejestracji użytkownika za pomocą imienia, nazwiska, adresu e-mail, telefonu i hasła.
Jeśli jakiekolwiek pole textField nie zawiera poprawnego tekstu, to pole powinno być pierwszeResponder.
oto niezoptymalizowany kod:
Jak widać powyżej, wszystkie ciągi znaków (firstNameString, lastNameString itp.) Są dostępne tylko w zakresie instrukcji if. więc tworzy tę "piramidę zagłady" i ma z nią wiele problemów, w tym czytelność i łatwość przenoszenia elementów (jeśli zmieni się kolejność pól, musisz przepisać większość tego kodu)
Za pomocą instrukcji guard (w poniższym kodzie) możesz zobaczyć, że te ciągi są dostępne poza
{}
polami i są używane, jeśli wszystkie pola są prawidłowe.Jeśli zmieni się kolejność pól, po prostu przesuń odpowiednie wiersze kodu w górę lub w dół i gotowe.
To bardzo proste wyjaśnienie i przypadek użycia. Mam nadzieję że to pomoże!
źródło
Podstawowa różnica
Niech strażnik
jeśli niech
UWAGA: Oba są używane do rozpakowania zmiennej opcjonalnej.
źródło
Najjaśniejsze wyjaśnienie, jakie widziałem, było w przewodniku po stylach Github Swift :
if
dodaje poziom głębi:guard
nie:źródło
strzec
Oświadczenie strażnika ma następującą postać:
jeśli niech
źródło
Nauczyłem się tego od szybkiego z Bobem.
Typowe inaczej, jeśli
Problemy z Else-If
Instrukcja Guard Blokada działa tylko wtedy, gdy warunek jest fałszywy i wyjdzie z funkcji poprzez powrót. Jeśli warunek jest spełniony, Swift ignoruje blokadę ochronną. Zapewnia wczesne wyjście i mniej nawiasów. +
Unwrap Optionals with Else-If
Instrukcja guard jest przydatna nie tylko do zastępowania typowego bloku warunkowego instrukcją else-if, ale także doskonale nadaje się do rozpakowywania opcji opcjonalnych poprzez minimalizację liczby nawiasów. Aby porównać, zacznijmy najpierw od rozpakowywania wielu opcji za pomocą else-if. Najpierw utwórzmy trzy opcje, które zostaną rozpakowane.
Najgorszy koszmar
Powyższy kod z pewnością działa, ale narusza zasadę DRY. To okropne. Złóżmy to. +
Trochę lepiej Poniższy kod jest bardziej czytelny niż powyżej. +
Rozpakowywanie z Guard Instrukcje else-if można zastąpić wyrażeniem guard. +
Unwrap Multiple Optionals with Else-If Do tej pory rozpakowywałeś opcje jeden po drugim. Swift pozwala nam jednocześnie rozpakować wiele opcji. Jeśli jeden z nich zawiera nil, wykona blok else.
Unwrap Multiple Optionals with Guard Oczywiście, powinniśmy użyć guard zamiast else-if. +
źródło