まず、私は[String]
を取得するには、[String?]
をマッピングしてみてください。Swift nil-coalescingがオプションで返されるのはなぜですか?
$ 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] = ""
}
これは私には完璧な意味があります。私はString?
とは結びつきません。私はString
になります。しかし[AnyObject?]
と、奇妙な何かが起こる:
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 @"")
}
私はnilに-合体optionalsんだけど、今回は私がオプションを取得します。どうして?
Swift Programming Languageがa ?? b
がa != nil ? a! : b
の略記であると言いますが、私はことをしようとしたとき、私は非optionalsの配列を取得します:
6> k.map {$0 != nil ? $0! : ""}
$R2: [AnyObject] = 2 values {
[0] = "a"
[1] = ""
}
私は??
が動作するようになっているか誤解だろうか?ここで何が起こっているのですか?
興味深い質問ですが、これと同じ理由で、これはうまくいきます。let res:[AnyObject] = k.map {$ 0 ?? ""} ' –
' AnyObject'とリテラルで奇妙な型推論問題のように見えます - これもうまくいきます: 'let k1 = k.map {$ 0 ??文字列()} ' – Hamish