Die Redewendung für den Umgang mit Optionen in Swift scheint übermäßig ausführlich zu sein, wenn Sie nur einen Standardwert für den Fall angeben möchten, dass er Null ist:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
das beinhaltet unnötiges Duplizieren von Code, oder
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
was erfordert, unwrappedValue
keine Konstante zu sein.
Scalas Optionsmonade (die im Grunde die gleiche Idee wie Swifts Optional ist) hat die Methode getOrElse
für diesen Zweck:
val myValue = optionalValue.getOrElse(defaultValue)
Vermisse ich etwas Hat Swift schon eine kompakte Möglichkeit, das zu tun? Oder ist es andernfalls möglich, getOrElse
in einer Erweiterung für Optional zu definieren ?
Antworten:
Aktualisieren
Apple hat jetzt einen Koaleszenzoperator hinzugefügt:
Der ternäre Operator ist in diesem Fall Ihr Freund
Sie können auch Ihre eigene Erweiterung für die optionale Aufzählung bereitstellen:
Dann können Sie einfach tun:
Ich empfehle jedoch, sich an den ternären Operator zu halten, da andere Entwickler dies viel schneller verstehen, ohne die
or
Methode untersuchen zu müssenHinweis : Ich begann ein Modul hinzufügen gemeinsame Helfer wie diese
or
aufOptional
rasche zu.quelle
unwrappedValue
in Swift 1.2 immer noch der optionale Typ für diesen Fall ist:var unwrappedValue = optionalValue ? optionalValue! : defaultValue
(xcode 6 beta 4). Hat sich das geändert???
Standardverhalten für Typinferenz ist, dass ein optionales zurückgegeben wird, was normalerweise nicht gewünscht wird. Sie können die Variable als nicht optional deklarieren, und dies funktioniert gut.Seit August 2014 hat Swift einen Koaleszenzoperator (??), der dies ermöglicht. Für einen optionalen String myOptional könnten Sie beispielsweise schreiben:
quelle
wenn du geschrieben hast:
und
optionalValue != nil
dannresult
wird esoptional
auch sein und Sie müssen es in Zukunft auspackenSie können aber Operator schreiben
Jetzt kannst du:
Und wann wird es
optionalValue != nil
dannresult
seinunwraped
quelle
Das Folgende scheint zu funktionieren
Die Notwendigkeit zu werfen
value as T
ist jedoch ein hässlicher Hack. Im Idealfall sollte es eine Möglichkeit geben, zu behaupten, dass sieT
mit dem in der Option enthaltenen Typ identisch ist.T
Geben Sie derzeit Inferenzsätze basierend auf dem für getOrElse angegebenen Parameter ein und schlagen Sie zur Laufzeit fehl, wenn dies nicht mit Optional übereinstimmt und Optional nicht Null ist:quelle
T
für die Methode nichts angeben . Das überschreibt tatsächlich das vorhandeneT
von Optional. Sie können einfach tun:func getOrElse(defaultValue: T) -> T
dann bezieht sich T auf den realenT
? (über die bloße Annahme aufgrund der Konvention hinaus)Optional
Xcode klicken , sehen Sie, dass es definiert ist alsenum Optional<T>