Zuerst versuche ich eine [String?]
Kartierung, erhalten eine [String]
:Warum gibt Swift null-coalescing ein Optional zurück?
$ xcrun swift
Welcome to Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.30). Type :help for assistance.
1> import Foundation
2> let j: [String?] = ["a", nil]
j: [String?] = 2 values {
[0] = "a"
[1] = nil
}
3> j.map {$0 ?? ""}
$R0: [String] = 2 values {
[0] = "a"
[1] = ""
}
Dies macht Sinn für mich. Ich füge kein String?
zusammen, und ich bekomme String
. Aber mit [AnyObject?]
, etwas seltsam vorkommt:
4> let k: [AnyObject?] = ["a", nil]
k: [AnyObject?] = 2 values {
[0] = "a"
[1] = nil
}
5> k.map {$0 ?? ""}
$R1: [AnyObject?] = 2 values {
[0] = "a"
[1] = (instance_type = 0x00007fff7bc2c140 @"")
}
Ich bin Null-Koaleszenz optionals, aber dieses Mal habe ich eine optionale raus. Warum?
Die Swift Programming Language sagt a ?? b
Abkürzung für a != nil ? a! : b
ist, aber wenn ich versuche, dass ich aus einer Reihe von Nicht-optionals:
6> k.map {$0 != nil ? $0! : ""}
$R2: [AnyObject] = 2 values {
[0] = "a"
[1] = ""
}
Bin ich Missverständnis, wie ??
funktionieren soll? Was geht hier vor sich?
Interessante Frage, aus dem gleichen Grund scheint dies zu funktionieren 'let res: [AnyObject] = k.map {$ 0 ?? ""} ' –
Sieht aus wie ein komisches Inferenz-Problem mit' AnyObject' und Literalen - das funktioniert auch: 'let k1 = k.map {$ 0 ?? String()} ' – Hamish