Kann jemand erklären, was im folgenden Code passiert? Es erzeugt eine Struktur Either
, die zwei beliebige optionale Typen verwendet und (versucht) das zurückgibt, was nicht gleich null ist, oder das erste, wenn beide nicht null sind. Aber es verhält sich seltsam, wenn wörtliche Null vorbei wie in zu einem Null-Variable gegenüber. Ich kann nicht sehen, warum b4
im Beispiel verhält, wie es funktioniert ...Implementieren von "Entweder" -Struktur in Swift
struct Either <T1, T2> {
let first: T1?
let second: T2?
init(first: T1?, second: T2?) {
self.first = first
self.second = second
}
func either() -> Bool {
return (self.first != nil) || (self.second != nil)
}
func which() -> Any? {
if self.first != nil {
return self.first
} else if self.second != nil {
return self.second
}
return nil
}
}
var s1: String? = nil
var s2: Int? = nil
let b1 = Either(first: s1, second: s2)
b1.either() // false
b1.which() // {nil}
s1 = "Hello"
let b2 = Either(first: s1, second: s2)
b2.either() // true
b2.which() // {Some Hello}
s1 = nil
s2 = 7
let b3 = Either(first: s1, second: s2)
b3.either() // true
b3.which() // {Some 7}
// all as expected, however
let b4 = Either(first: nil, second: nil)
b4.either() // true !!! <<<<<<<<<<<<<<<<<<
b4.which() // {nil}
Ich denke, es mit „Optional zu tun hat Optionals ", aber ich bin mir nicht sicher, ob es sich wie erwartet verhält.
Danke für den Link, @Sulthan. Das Hinzufügen der "if let" -Klauseln, die sie vorgeschlagen haben, machte keinen Unterschied, aber ihre Schlussbemerkung "Vielleicht mischen Sie nicht optionals und Any" ist ... gut ... weniger als ideal! Ich finde es besorgniserregend, dass ich nicht vorhersagen/rationalisieren kann, warum das passiert. – Grimxn
'let b4 = Entweder (zuerst: Null, Sekunde: Null)' funktioniert, wie Sie vorschlagen. Horror. –
Grimxn
@Grimxn Ich habe gerade Xcode und musste meine Antwort bearbeiten, weil das Problem komplizierter ist, als ich ursprünglich dachte. – Sulthan