首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中嵌套选项及其数组的推断、静态和动态类型

Swift中嵌套选项及其数组的推断、静态和动态类型
EN

Stack Overflow用户
提问于 2015-10-05 22:43:04
回答 1查看 102关注 0票数 2

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

代码语言:javascript
复制
                            // 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

EN

回答 1

Stack Overflow用户

发布于 2015-10-07 20:36:30

当您看到let os = [oi, ooi] // [{nil}, nil]时,大括号很重要,因为它们表示数组的第一项确实有一个值,而这个值是nil (我知道,这听起来可能很奇怪)。

如果你使用os.dynamicType,你会得到Array<Optional<Optional<Int>>>.Type

使用下面的代码可以更清楚地了解:

代码语言:javascript
复制
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而不会崩溃的原因。

在我看来,当您处理多个可选层时,更容易将optionals视为Struct

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32951386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档