以下代码中的推断值和动态值类型之间似乎存在不一致(超出了静态方面的预期通用性):
// playground values in Xcode 7.0.1 (7A1001)
// (same behaviour in a release build)
let oi: Int? = nil // nil
let ooi: Int?? = nil // nil
let os = [oi, ooi] // [{nil}, nil]
let anys: [Any] = [oi, ooi] // [nil, nil]
oi == nil // true
ooi == nil // true
os[0] == nil // false
os[1] == nil // true
os[0].dynamicType // Optional<Optional<Int>>.Type
os[1].dynamicType // Optional<Optional<Int>>.Type
anys[0].dynamicType // Optional<Int>.Type
anys[1].dynamicType // Optional<Optional<Int>>.Type
(os[0] as Any).dynamicType // Optional<Optional<Int>>.Type
(os[1] as Any).dynamicType // Optional<Optional<Int>>.Type
os[0]! // nil
os[1]! // fatal error: unexpectedly found nil while unwrapping an Optional value
例如,我们是否应该期望os[0].dynamicType
返回Optional<Int>.Type
?
答案 0 :(得分:0)
当你看到let os = [oi, ooi] // [{nil}, nil]
时,花括号很重要,因为他们说数组的第一项确实有一个值而且这个值是nil(听起来很奇怪,我知道)。
如果您执行os.dynamicType
,则会获得Array<Optional<Optional<Int>>>.Type
。
使用以下代码可以更清楚:
switch os[0]
{
case .None: print("None")
case .Some(let value): print("Some") // "Some\n"
switch value
{
case .None: print("None") // "None\n"
case .Some(let value): print("Some")
}
}
这也是os[0]!
等于nil
并且不会崩溃的原因。
在我看来,当您处理多个可选图层时,将{/ 1}}作为Struct
更容易考虑。