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

Swift中嵌套选项及其数组的推断、静态和动态类型,swift,swift2,optional,dynamictype,Swift,Swift2,Optional,Dynamictype,以下代码中的推断值和动态值类型之间似乎不一致(超出了静态方面的预期通用性): //Xcode 7.0.1(7A1001)中的值 //(发布版本中的行为相同) 让oi:Int?=零//零 让ooi:Int???=零//零 设os=[oi,ooi]/[{nil},nil] 让anys:[Any]=[oi,ooi]/[nil,nil] oi==nil//true ooi==nil//true os[0]==nil//false os[1]==nil//true os[0]。动态类型//可选。类型 os

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

//Xcode 7.0.1(7A1001)中的值
//(发布版本中的行为相同)
让oi:Int?=零//零
让ooi:Int???=零//零
设os=[oi,ooi]/[{nil},nil]
让anys:[Any]=[oi,ooi]/[nil,nil]
oi==nil//true
ooi==nil//true
os[0]==nil//false
os[1]==nil//true
os[0]。动态类型//可选。类型
os[1]。动态类型//可选。类型
anys[0]。dynamicType//Optional.Type
anys[1]。dynamicType//Optional.Type
(操作系统[0]与任何操作系统一样)。dynamicType//可选。Type
(操作系统[1]如有)。dynamicType//可选。Type
操作系统[0]!//无
操作系统[1]!//致命错误:在展开可选值时意外发现nil

例如,如果我们不希望
os[0].dynamicType
返回
可选。Type

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

如果执行
os.dynamicType
,您将得到
Array.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
并且不会崩溃


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

谢谢您的回答。唉,我不太清楚您的代码示例“更清楚”了什么。请注意,嵌套选项是模式匹配平面(例如,切换类型为
Int???
ooi
将通过该代码打印
None
)。因此,无论是
os[0]
模式匹配为
Int?
还是
Int???
,行为都不应被观察到。。。
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")
    }
}