Swift

时间:2015-10-05 14:43:04

标签: swift swift2 optional dynamictype

以下代码中的推断值和动态值类型之间似乎存在不一致(超出了静态方面的预期通用性):

                            // 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

1 个答案:

答案 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更容易考虑。