Próbuję z tymi liniami kodu
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
Powyższy kod daje następujące wyniki
Daniel hides his age.
Daniel is Optional(18) years old.
Moje pytanie brzmi, dlaczego jest tam opcja (18), jak mogę usunąć opcjonalną i tylko drukowanie
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Opcjonalne oznacza, że Swift nie jest całkowicie pewien, czy wartość odpowiada typowi: na przykład Int? oznacza, że Swift nie jest całkowicie pewien, czy liczba jest liczbą Int.
1) Jeśli jesteś absolutnie pewien typu, możesz użyć wykrzyknika, aby wymusić jego rozpakowanie, na przykład:
Jeśli wymusisz rozpakowanie opcjonalnego i jest on równy zero, możesz napotkać ten błąd awarii:
Niekoniecznie jest to bezpieczne, więc oto metoda, która może zapobiec awariom w przypadku braku pewności co do typu i wartości:
2) niejawnie nieopakowany opcjonalny
3) Oświadczenie strażnika
Stąd możesz iść dalej i użyć nieopakowanej zmiennej. Upewnij się, że wymuszasz rozpakowywanie (za pomocą!), Jeśli jesteś pewien typu zmiennej.
źródło
Do celów testowania / debugowania często chcę wyprowadzać opcje w postaci ciągów bez konieczności testowania
nil
wartości, dlatego utworzyłem niestandardowy operator.Po przeczytaniu tej odpowiedzi w innym pytaniu poprawiłem się jeszcze bardziej .
Oczywiście operator (i jego atrybuty) można dostosować do własnych upodobań lub zamiast tego można uczynić go funkcją. W każdym razie umożliwia to pisanie prostego kodu, takiego jak ten:
Integracja koncepcji protokołu drugiego faceta sprawiła, że działa to nawet z zagnieżdżonymi opcjami, które często występują podczas korzystania z opcjonalnego łączenia. Na przykład:
źródło
String
w innym miejscu (np. Dziennik / komunikat o błędzie).Aktualizacja
Po prostu użyj
me.age ?? "Unknown age!"
. Działa w wersji 3.0.2.Stara odpowiedź
Bez rozwijania siły (bez sygnału mach / crash, jeśli zero), innym dobrym sposobem na zrobienie tego byłoby:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
powinien też działać, ale tak się nie dzieje, przynajmniej nie w wersji 2.2Oczywiście, zastąp „niedostępny” tym, co ci odpowiada: „nil”, „nie znaleziono” itp
źródło
Aby rozpakować opcjonalne, użyj
age!
zamiastage
. Obecnie drukujesz opcjonalną wartość, która może byćnil
. Właśnie dlatego jest opakowanyOptional
.źródło
W szybkim
Optional
jest coś, co może byćnil
w niektórych przypadkach. Jeśli masz 100% pewności, że avariable
zawsze będzie miał jakąś wartość i nie zwrócinil
add!
ze zmienną, aby wymusić jej rozpakowanie.W innym przypadku, jeśli nie masz pewności co do wartości, dodaj
if let
blok lubguard
upewnij się, że wartość istnieje, w przeciwnym razie może to spowodować awarię.Dla
if let
bloku:Do
guard
oświadczenia:guard
jest strukturą warunkową zwracającą kontrolę, jeśli warunek nie zostanie spełniony.W wielu sytuacjach wolę używać
guard
overif let
block, ponieważ pozwala nam to zwrócić,function
jeśli określona wartość nie istnieje. Tak jak wtedy, gdy istnieje funkcja, w której zmienna jest całka, aby istnieć, możemy sprawdzić ją w instrukcji guard i jej zwrot nie istnieje. to znaczy;Jeśli zmienna istnieje, możemy użyć 'abc' w funkcji poza zasięgiem ochrony.
źródło
age
jest typem opcjonalnym:Optional<Int>
więc jeśli porównasz go do nil, zwraca on fałsz za każdym razem, gdy ma wartość lub nie ma. Aby uzyskać wartość, musisz rozpakować opcjonalne.W Twoim przykładzie nie wiesz, czy zawiera jakąkolwiek wartość, więc możesz użyć tego zamiast tego:
źródło
Zrobiłem to, aby wydrukować wartość ciągu (właściwości) z innego kontrolera widoku.
ViewController.swift
SecondViewController.swift
Wynik:
źródło
Sprawdź
guard
oświadczenie:źródło
Mając wartość domyślną:
print("\(name) is \(age ?? 0) years old")
lub gdy nazwa jest opcjonalna:
print("\(name ?? "unknown") is \(age) years old")
źródło
W moich komórkach widoku tabeli pojawiał się opcjonalny („ciąg”).
Pierwsza odpowiedź jest świetna. I pomógł mi to rozgryźć. Oto, co zrobiłem, aby pomóc nowicjuszom takim jak ja.
Ponieważ tworzę tablicę w moim obiekcie niestandardowym, wiem, że zawsze będzie ona zawierała elementy na pierwszej pozycji, więc mogę wymusić rozpakowanie jej do innej zmiennej. Następnie użyj tej zmiennej do wydrukowania lub w moim przypadku ustaw na tekst komórki widoku tabeli.
Wydaje się teraz takie proste, ale zajęło mi trochę czasu, zanim to rozgryzłem.
źródło
To nie jest dokładna odpowiedź na to pytanie, ale jeden z powodów tego rodzaju problemów. W moim przypadku nie udało mi się usunąć Optional z String z „if let” i „guard let”.
Więc użyj AnyObject zamiast Any, aby usunąć opcjonalne z ciągu w swift.
Proszę odnieść się do linku do odpowiedzi.
https://stackoverflow.com/a/51356716/8334818
źródło