Używam Xcode 6 Beta 4. Mam dziwną sytuację, w której nie mogę dowiedzieć się, jak odpowiednio przetestować opcje.
Jeśli mam opcjonalny xyz, to właściwy sposób na przetestowanie:
if (xyz) // Do something
lub
if (xyz != nil) // Do something
Dokumenty mówią, że należy to zrobić w pierwszy sposób, ale odkryłem, że czasami drugi sposób jest wymagany i nie generuje błędu kompilatora, ale czasami drugi sposób generuje błąd kompilatora.
Mój konkretny przykład to użycie parsera GData XML zmostkowanego do Swift:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Tutaj, gdybym właśnie to zrobił:
if xmlError
zawsze zwracała prawdę. Jeśli jednak:
if (xmlError != nil)
wtedy to działa (tak jak to działa w Objective-C).
Czy jest coś w GData XML i sposobie, w jaki traktuje opcje, których mi brakuje?
Odpowiedzi:
W Xcode Beta 5 nie pozwalają już na:
Powoduje to błąd:
Musisz użyć jednego z tych formularzy:
źródło
Aby dodać do innych odpowiedzi, zamiast przypisywać do zmiennej o innej nazwie wewnątrz
if
warunku:możesz ponownie użyć tej samej nazwy zmiennej, na przykład:
Pomoże Ci to uniknąć wyczerpania nazw zmiennych kreacji ...
Wykorzystuje to zmienne cieniowanie, które jest obsługiwane w języku Swift.
źródło
Jednym z najbardziej bezpośrednich sposobów korzystania z opcji jest:
Założenie
xyz
jest opcjonalne, jakInt?
na przykład.W ten sposób możesz zarówno sprawdzić, czy
xyz
zawiera wartość, a jeśli tak, natychmiast pracować z tą wartością.Jeśli chodzi o błąd kompilatora, typ
UInt8
nie jest opcjonalny (uwaga nr „?”) I dlatego nie można go przekonwertować nanil
. Upewnij się, że zmienna, z którą pracujesz, jest opcjonalna, zanim potraktujesz ją jako jedną.źródło
Swift 3.0, 4.0
Istnieją głównie dwa sposoby sprawdzenia, czy nil jest opcjonalny. Oto przykłady z porównaniem między nimi
1. jeśli niech
if let
to najbardziej podstawowy sposób sprawdzania, czy nil jest opcjonalny. Do tego czeku zerowego można dołączyć inne warunki, oddzielone przecinkami. Zmienna nie może być zerowa, aby przejść do następnego warunku. Jeśli wymagane jest tylko sprawdzenie zerowe, usuń dodatkowe warunki w poniższym kodzie.Poza tym, jeśli
x
nie jest zerowe, zamknięcie if zostanie wykonane ix_val
będzie dostępne w środku. W przeciwnym razie następuje zamknięcie else.2. niech strażnik
guard let
mogą robić podobne rzeczy. Jego głównym celem jest uczynienie go bardziej logicznym. To tak, jakby powiedzieć , że zmienna nie jest zerowa, w przeciwnym razie zatrzymaj funkcję .guard let
może również sprawdzić dodatkowe warunki jakoif let
.Różnice polegają na tym, że rozpakowana wartość będzie dostępna w tym samym zakresie, co
guard let
, jak pokazano w komentarzu poniżej. Prowadzi to również do tego stopnia, że w innym zamknięciem, program musi wyjść z obecnego zakresu, przezreturn
,break
itdźródło
Z szybkiego przewodnika po programowaniu
Więc najlepszym sposobem na to jest
a jeśli używasz instrukcji
xyz
in if, możesz wtedy rozpakowaćxyz
instrukcję if w zmiennej stałej. Więc nie musisz rozpakowywać każdego miejsca w instrukcji if, gdziexyz
jest używana.Ta konwencja jest sugerowana
apple
przez deweloperów i będą ją stosować.źródło
if xyz != nil {...}
.Chociaż nadal musisz jawnie porównać opcjonalne z
nil
lub użyć opcjonalnego wiązania, aby dodatkowo wyodrębnić jego wartość (tj. Opcje opcjonalne nie są niejawnie konwertowane na wartości logiczne), warto zauważyć, że Swift 2 dodałguard
instrukcję, aby pomóc uniknąć piramidy zagłady podczas pracy z wieloma opcjonalnymi wartościami.Innymi słowy, dostępne opcje obejmują teraz jawne sprawdzenie
nil
:Opcjonalne wiązanie:
I
guard
oświadczenia:Zwróć uwagę, jak zwykłe opcjonalne powiązanie może prowadzić do większego wcięcia, gdy istnieje więcej niż jedna opcjonalna wartość:
Możesz uniknąć tego zagnieżdżania za pomocą
guard
instrukcji:źródło
nil
wartości, ale zgadzam się, że krzywa uczenia się jest nieco stroma. :)Rozszerzenie protokołu Swift 5
Oto podejście wykorzystujące rozszerzenie protokołu, dzięki czemu można łatwo wstawić opcjonalną kontrolę zerową:
Stosowanie
źródło
swift
tego,pythonistas
który próbuje zachować język w jakiejś formie pytonicznej czystości. Moje podanie? Właśnie umieściłem twój kod w moim miksie Utils.Teraz możesz szybko wykonać następującą rzecz, która pozwoli ci odzyskać odrobinę celu-c
if nil else
źródło
Zamiast tego
if
operator potrójny może się przydać, gdy chcesz uzyskać wartość na podstawie tego, czy coś jest zerowe:źródło
xyz == nil
wyrażenie nie działa, alex != nil
działa. Nie wiem dlaczego.Innym podejściem, oprócz używania instrukcji
if
lubguard
do wykonania opcjonalnego wiązania, jest rozszerzenie zaOptional
pomocą:ifValue
otrzymuje zamknięcie i wywołuje je z wartością jako argumentem, gdy opcjonalny nie jest zerowy. Jest używany w ten sposób:Prawdopodobnie powinieneś użyć
if
lubguard
jednak, ponieważ są to najbardziej konwencjonalne (a więc znane) podejścia używane przez programistów Swift.źródło
Jedną z opcji, która nie została szczegółowo omówiona, jest użycie ignorowanej składni wartości Swift:
Podoba mi się to, ponieważ sprawdzanie
nil
czuje się nie na miejscu w nowoczesnym języku, takim jak Swift. Myślę, że powodem, dla którego wydaje się to nie na miejscu,nil
jest w zasadzie wartość wartownicza. Zrezygnowaliśmy z wartowników praktycznie wszędzie indziej we współczesnym programowaniu, więcnil
wydaje się, że to też powinno odejść.źródło
Możesz również użyć
Nil-Coalescing Operator
Jeśli
optionalValue
taknil
, automatycznie przypisuje wartośćdefaultValue
źródło
Ten test działał zgodnie z oczekiwaniami we wszystkich przypadkach. BTW, nie potrzebujesz nawiasów
()
.źródło
if (xyz != nil)
.Jeśli masz warunkowe i chciałbyś rozpakować i porównać, co powiesz na skorzystanie z oceny zwarcia złożonego wyrażenia logicznego, jak w
To prawda, nie jest to tak czytelne, jak niektóre inne sugerowane posty, ale wykonuje zadanie i jest nieco zwięzłe niż inne sugerowane rozwiązania.
źródło