Swift 2 wprowadził guard
słowo kluczowe, którego można użyć, aby upewnić się, że różne dane są skonfigurowane gotowe do pracy. Przykład, który widziałem na tej stronie demonstruje funkcję submTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Zastanawiam się, czy używanie guard
jest czymś innym niż robienie tego w staromodny sposób, przy użyciu if
warunku. Czy daje to korzyści, których nie można uzyskać za pomocą prostego czeku?
swift2
guard-statement
David Snabel
źródło
źródło
Odpowiedzi:
Czytając ten artykuł , zauważyłem wspaniałe korzyści ze stosowania Guard
Tutaj możesz porównać użycie warty z przykładem:
Oto część bez osłony:
Tutaj umieszczasz żądany kod we wszystkich warunkach
Być może nie zauważysz od razu problemu z tym, ale możesz sobie wyobrazić, jak może być mylące, jeśli zostanie zagnieżdżone w wielu warunkach, które muszą zostać spełnione przed uruchomieniem instrukcji
Sposobem na oczyszczenie tego jest wykonanie każdego z czeków w pierwszej kolejności i wyjście, jeśli nie zostaną spełnione. Pozwala to na łatwe zrozumienie, jakie warunki spowodują wyjście z tej funkcji.
Ale teraz możemy użyć straży i widzimy, że można rozwiązać niektóre problemy:
Ten sam wzorzec obowiązuje również w przypadku wartości nieobowiązkowych:
Jeśli nadal masz pytania, możesz przeczytać cały artykuł: Szybka wypowiedź wartownika.
Podsumowanie
I na koniec, czytając i testując, odkryłem, że jeśli używasz wartownika, aby rozpakować dowolne opcje,
.
Tutaj rozpakowana wartość byłaby dostępna tylko w bloku if
źródło
let x = x where x > 0
czy oznacza to, że połączyłeś inny warunek z opcjonalnym wiązaniem? To znaczy, że jest trochę inaczej niżif let constantName = someOptional { statements }
W przeciwieństwie
if
,guard
tworzy zmienną, które mogą być dostępne z zewnątrz jej bloku. Przydatne jest rozpakowanie wieluOptional
s.źródło
Są naprawdę dwie duże korzyści
guard
. Jednym z nich jest unikanie piramidy zagłady, jak wspomnieli inni - wiele irytującychif let
stwierdzeń zagnieżdżonych w sobie, poruszających się coraz bardziej w prawo.Inną korzyścią jest często logika, którą chcesz wdrożyć: „
if not let
” niż „if let { } else
”.Oto przykład: załóżmy, że chcesz zaimplementować
accumulate
- krzyżowaniemap
i miejsce, wreduce
którym zwraca tablicę uruchomień, zmniejsza. Oto on zguard
:Jak napisałbyś to bez ochrony, ale nadal używanie
first
tego zwraca opcjonalne? Coś takiego:Dodatkowe zagnieżdżanie jest denerwujące, ale też nie jest tak logiczne, aby rozdzielić
if
ielse
dotychczas. O wiele bardziej czytelne jest wczesne wyjście z pustej skrzynki, a następnie kontynuacja reszty funkcji, jakby to nie była możliwość.źródło
Gdy warunek jest spełniony przy użyciu
guard
, ujawnia zmienne zadeklarowane wguard
bloku reszcie bloku kodu, wprowadzając je do swojego zakresu. Co, jak wcześniej wspomniano, z pewnością przyda się w przypadku zagnieżdżonychif let
instrukcji.Zauważ, że wartownik wymaga zwrotu lub rzutu w swojej instrukcji else.
Przetwarzanie JSON ze Strażnikiem
Poniżej znajduje się przykład tego, w jaki sposób można parsować obiekt JSON za pomocą wartownika zamiast if-let. To jest fragment wpisu na blogu, który zawiera plik placu zabaw, który można znaleźć tutaj:
Jak korzystać ze Strażnika w Swift 2, aby analizować JSON
pobierz plac zabaw: straży
Więcej informacji:
Oto fragment Przewodnika języka programowania Swift:
źródło
Jedną z korzyści jest wyeliminowanie wielu zagnieżdżonych
if let
instrukcji. Obejrzyj film WWDC „What's New in Swift” około 15:30, sekcja zatytułowana „Pyramid of Doom”.źródło
Kiedy używać strażników
Jeśli masz kontroler widoku z kilkoma elementami UITextField lub innym rodzajem danych wprowadzanych przez użytkownika, natychmiast zauważysz, że musisz rozpakować opcjonalny textField.text, aby dostać się do tekstu w środku (jeśli istnieje!). isEmpty nie zrobi tu nic dobrego, bez żadnego wpisu pole tekstowe po prostu zwróci zero.
Masz więc kilka z nich, które rozpakowujesz i ostatecznie przekazujesz do funkcji, która wysyła je do punktu końcowego serwera. Nie chcemy, aby kod serwera miał do czynienia z zerowymi wartościami lub przez pomyłkę wysyłał nieprawidłowe wartości do serwera, więc najpierw rozpakujemy te wartości wejściowe za pomocą wartownika.
Zauważysz, że nasza funkcja komunikacji z serwerem przyjmuje jako parametry nie opcjonalne wartości ciągu, dlatego przedtem rozpakuj straż. Rozpakowywanie jest trochę nieintuicyjne, ponieważ jesteśmy przyzwyczajeni do rozpakowywania, jeśli pozwala, które rozpakowuje wartości do użycia w bloku. W tym przypadku instrukcja guard ma powiązany blok, ale w rzeczywistości jest to blok inny - tzn. Czynność wykonywana w przypadku niepowodzenia rozpakowywania - wartości są rozpakowywane bezpośrednio w tym samym kontekście, co sama instrukcja.
// rozdzielenie obaw
Bez ochrony
Bez użycia straży otrzymalibyśmy wielki stos kodu, który przypomina piramidę zagłady . Nie skaluje się to dobrze do dodawania nowych pól do naszego formularza ani do tworzenia bardzo czytelnego kodu. Wcięcie może być trudne do naśladowania, szczególnie przy wielu innych stwierdzeniach przy każdym rozwidleniu.
Tak, moglibyśmy nawet połączyć je wszystkie, jeśli pozwolimy na instrukcje w jedną instrukcję oddzieloną przecinkami, ale stracilibyśmy możliwość stwierdzenia, która instrukcja się nie powiodła i przedstawienia użytkownikowi komunikatu.
https://thatthinginswift.com/guard-statement-swift/
źródło
Dzięki użyciu osłony nasze intencje są jasne. nie chcemy wykonywać reszty kodu, jeśli ten szczególny warunek nie jest spełniony. tutaj możemy również rozszerzyć łańcuch, spójrz na poniższy kod:
źródło
Strażnik zamierza zrobić. jest kilka różnych
1) pozwala mi zmniejszyć zagnieżdżone, jeśli instrukcja
2) zwiększyć zakres, do którego moja zmienna jest dostępna
Instrukcja if
Strażnik
źródło
Strażnik
Instrukcja straży służy do przeniesienia kontroli programu poza zakres, jeśli nie jest spełniony co najmniej jeden warunek.
Synatx:
Korzyść:
1. Za pomocą
guard
instrukcji możemy pozbyć się głęboko zagnieżdżonych instrukcji warunkowych, których jedynym celem jest sprawdzanie poprawności zestawu wymagań.2. Został zaprojektowany specjalnie do wcześniejszego opuszczenia metody lub funkcji.
jeśli użyjesz, jeśli poniżej znajduje się kod, jak to wygląda.
Za pomocą wartownika możesz przenieść kontrolę poza zakres, jeśli nie jest spełniony jeden lub więcej warunków.
Odniesienie:
1. Swift 2: Wyjdź wcześnie ze strażnikiem 2. Udacity 3. Strażnik
źródło
if condition { return }
gburowaty?Podobnie jak instrukcja if, guard wykonuje instrukcje na podstawie logicznej wartości wyrażenia. W przeciwieństwie do instrukcji if, instrukcje guard działają tylko wtedy, gdy warunki nie są spełnione. Możesz myśleć o straży bardziej jak Assert, ale zamiast upaść, możesz z wdziękiem wyjść.
patrz: http://ericcerney.com/swift-guard-statement/
źródło
Naprawdę naprawdę sprawia, że przepływ sekwencji z kilkoma przeglądami i opcjami jest o wiele bardziej zwięzły i przejrzysty i zmniejsza wiele zagnieżdżania. Zobacz post Erica Sadun na temat zastępowania Ifs . .... Może dać się ponieść, przykład poniżej:
Sprawdź, czy to się trzyma.
źródło
Mówiąc najprościej, zapewnia sposób sprawdzania poprawności pól przed wykonaniem. To dobry styl programowania, ponieważ zwiększa czytelność. W innych językach może to wyglądać tak:
Ponieważ jednak Swift udostępnia opcje, nie możemy sprawdzić, czy jest zero, i przypisać jego wartość do zmiennej. W przeciwieństwie do
if let
tego sprawdza, czy nie jest zero, i przypisuje zmienną do przechowywania wartości rzeczywistej. Tu właśnieguard
wchodzi w grę. Daje ci bardziej zwięzły sposób wychodzenia z wcześniejszych opcji.źródło
Źródło: Guard in Swift
Zobaczmy przykład, aby jasno to zrozumieć
Przykład 1:
W powyższym przykładzie widzimy, że 3 jest większe niż 2 i instrukcja wewnątrz klauzuli guard else jest pomijana i wypisywana jest prawda.
Przykład 2:
W powyższym przykładzie widzimy, że 1 jest mniejsze niż 2 i instrukcja wewnątrz klauzuli guard else jest wykonywana, a fałsz jest drukowany, a następnie zwracany.
W powyższym przykładzie używamy wartownika let, aby rozpakować opcje. W funkcji getName zdefiniowaliśmy zmienną typu string myName, która jest opcjonalna. Następnie używamy wartownika let, aby sprawdzić, czy zmienna myName ma wartość zero, czy nie, jeśli nie zostanie przypisana do nazwy i sprawdzi ponownie, nazwa nie jest pusta. Jeśli oba warunki zostaną spełnione, tzn. Prawda, blok else zostanie pominięty i zostanie wyświetlony komunikat „Warunki są spełnione z nazwą”.
Zasadniczo sprawdzamy tutaj dwie rzeczy oddzielone przecinkiem, najpierw rozpakowujemy i opcjonalnie i sprawdzamy, czy spełnia to warunek, czy nie.
Tutaj nie przekazujemy nic do funkcji, tj. Pusty ciąg, a zatem Warunek jest fałszywy, to druk.
Tutaj przekazujemy funkcję „Hello” do funkcji i widać, że wydrukowany jest komunikat „Warunek jest spełniony Witaj”.
źródło