Ich versuche es mit diesen Codezeilen
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())
Der obige Code erzeugt wie folgt
Daniel hides his age.
Daniel is Optional(18) years old.
Meine Frage ist, warum es dort Optional (18) gibt, wie ich das Optionale entfernen und nur drucken kann
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.
Optional bedeutet, dass Swift nicht ganz sicher ist, ob der Wert dem Typ entspricht: Zum Beispiel Int? bedeutet, dass Swift nicht ganz sicher ist, ob die Nummer ein Int ist.
1) Wenn Sie sich des Typs absolut sicher sind, können Sie ein Ausrufezeichen verwenden, um das Auspacken wie folgt zu erzwingen:
Wenn Sie ein optionales Auspacken erzwingen und es gleich Null ist, kann dieser Absturzfehler auftreten:
Dies ist nicht unbedingt sicher. Hier ist eine Methode, die einen Absturz verhindern kann, falls Sie sich über Typ und Wert nicht sicher sind:
2) Die implizit ausgepackte Option
3) Die Wachaussage
Von hier aus können Sie die entpackte Variable verwenden. Stellen Sie sicher, dass Sie das Auspacken nur erzwingen (mit einem!), Wenn Sie sich über den Typ der Variablen sicher sind.
quelle
Zu Test- / Debugging-Zwecken möchte ich häufig Optionen als Zeichenfolgen ausgeben, ohne immer auf
nil
Werte testen zu müssen. Deshalb habe ich einen benutzerdefinierten Operator erstellt.Nachdem ich diese Antwort in einer anderen Frage gelesen hatte, verbesserte ich die Dinge noch weiter .
Natürlich kann der Operator (und seine Attribute) nach Ihren Wünschen angepasst werden, oder Sie können ihn stattdessen zu einer Funktion machen. Auf diese Weise können Sie einfachen Code wie folgt schreiben:
Durch die Integration der Protokollidee des anderen wurde dies sogar so, dass dies sogar mit verschachtelten Optionen funktioniert, die häufig bei Verwendung der optionalen Verkettung auftreten. Beispielsweise:
quelle
String
anderen Stelle übergeben oder einbetten (z. B. ein Protokoll / eine Fehlermeldung).Aktualisieren
Einfach benutzen
me.age ?? "Unknown age!"
. Es funktioniert in 3.0.2.Alte Antwort
Ohne gewaltsames Auspacken (kein Mach-Signal / Absturz, wenn nichts) wäre eine andere gute Möglichkeit, dies zu tun:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
sollte auch funktionieren, tut es aber nicht, zumindest nicht in 2.2Ersetzen Sie "nicht verfügbar" durch das, was zu Ihnen passt: "null", "nicht gefunden" usw.
quelle
Zum Auspacken der optionalen Verwendung
age!
anstelle vonage
. Derzeit drucken Sie einen optionalen Wert, der sein könntenil
. Deshalb wickelte es mitOptional
.quelle
In schnell
Optional
ist etwas, wasnil
in einigen Fällen sein kann. Wenn Sie zu 100% sicher sind, dass avariable
immer einen Wert hat undnil
das Add nicht!
mit der Variablen zurückgibt, um das Entpacken zu erzwingen.In anderen Fällen, wenn Sie sich des Werts nicht sicher sind, fügen Sie einen
if let
Block hinzu oderguard
stellen Sie sicher, dass der Wert vorhanden ist. Andernfalls kann dies zu einem Absturz führen.Für
if let
Block:Zur
guard
Aussage:guard
ist eine bedingte Struktur zur Rückgabe der Steuerung, wenn die Bedingung nicht erfüllt ist.Ich bevorzuge in vielen Situationen die Verwendung von
guard
overif let
block, da wir damit denfunction
Wert zurückgeben können, wenn ein bestimmter Wert nicht vorhanden ist. Wie wenn es eine Funktion gibt, bei der eine Variable als Integral vorhanden ist, können wir sie in der Guard-Anweisung überprüfen, und die Rückgabe existiert nicht. dh;Wenn eine Variable existiert, können wir 'abc' in der Funktion außerhalb des Schutzbereichs verwenden.
quelle
age
ist ein optionaler Typ:Optional<Int>
Wenn Sie ihn also mit nil vergleichen, wird jedes Mal false zurückgegeben, wenn er einen Wert hat oder nicht. Sie müssen das Optionale auspacken, um den Wert zu erhalten.In Ihrem Beispiel wissen Sie nicht, dass es einen Wert enthält, sodass Sie diesen stattdessen verwenden können:
quelle
Ich habe dies getan, um den Wert der Zeichenfolge (Eigenschaft) von einem anderen Ansichts-Controller zu drucken.
ViewController.swift
SecondViewController.swift
Ergebnis:
quelle
Schauen Sie sich die
guard
Erklärung an:quelle
Bei einem Standardwert:
print("\(name) is \(age ?? 0) years old")
oder wenn der Name optional ist:
print("\(name ?? "unknown") is \(age) years old")
quelle
Ich habe das Optionale ("Zeichenfolge") in meinen Tabellenansichtszellen erhalten.
Die erste Antwort ist großartig. Und hat mir geholfen, es herauszufinden. Hier ist, was ich getan habe, um den Neulingen da draußen wie mir zu helfen.
Da ich in meinem benutzerdefinierten Objekt ein Array erstelle, weiß ich, dass sich immer Elemente an der ersten Position befinden, sodass ich das Entpacken in eine andere Variable erzwingen kann. Verwenden Sie dann diese Variable, um zu drucken, oder setzen Sie in meinem Fall den Zelltext der Tabellenansicht.
Scheint jetzt so einfach, aber ich habe eine Weile gebraucht, um es herauszufinden.
quelle
Dies ist nicht die genaue Antwort auf diese Frage, sondern ein Grund für diese Art von Problem. In meinem Fall konnte ich Optional nicht mit "if let" und "guard let" aus einem String entfernen.
Verwenden Sie also AnyObject anstelle von Any , um optional schnell aus einer Zeichenfolge zu entfernen.
Bitte beziehen Sie sich auf den Link für die Antwort.
https://stackoverflow.com/a/51356716/8334818
quelle