Tout d'abord, je tente de mapper un [String?]
, pour obtenir un [String]
:Pourquoi Swift nil-coalescing retourne-t-il un optionnel?
$ 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] = ""
}
Cela fait sens pour moi. Je ne fusionne aucun String?
et j'obtiens un String
. Mais avec [AnyObject?]
, quelque chose d'étrange se produit:
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 @"")
}
Je suis Optionals nul coalescent, mais cette fois je sors une option. Pourquoi?
Le Swift Programming Language dit a ?? b
est un raccourci pour a != nil ? a! : b
, mais lorsque je tente, je sortir un tableau de non-optionals:
6> k.map {$0 != nil ? $0! : ""}
$R2: [AnyObject] = 2 values {
[0] = "a"
[1] = ""
}
que je comprends mal comment ??
est censé fonctionner? Qu'est-ce qui se passe ici?
question intéressante, pour cette raison cela semble fonctionner 'res laisser: [ANYOBJECT] = k.map {$ 0 ?? ""} ' –
On dirait un problème d'inférence de type bizarre avec' AnyObject' et littéraux - cela fonctionne aussi: 'laisser k1 = k.map {$ 0 ?? String()} ' – Hamish