在Xcode 8中隐式解包可选赋值

时间:2016-09-22 08:02:08

标签: ios swift xcode

在Xcode 8发布版中,我发现了一个奇怪的场景。

这是代码,

let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString"
let foo = implicitlyUnwrappedOptionalString

print(implicitlyUnwrappedOptionalString)
print(foo)

以下是结果:

implicitlyUnwrappedOptionalString
Optional("implicitlyUnwrappedOptionalString")

以上显示当我将隐式展开的可选分配给没有显式类型的变量时,该类型将被推断为可选类型,而不是它最初的类型,即隐式解包可选

我的Xcode已更新为8.任何人都可以验证Xcode 7.x中的行为吗?

更改是由于Swift版本更改还是Xcode?

1 个答案:

答案 0 :(得分:10)

这是SE-0054 Abolish ImplicitlyUnwrappedOptional type的结果,已在Swift 3中实现。从该提案中提取(强调添加):

  但是,外观!在属性或变量声明类型的末尾不再表示声明具有IUO类型;相反,它表示(1)声明具有可选类型,(2)声明具有一个属性,指示可以隐式强制其值。 ...

     

如果可以使用强可选类型显式地检查表达式,那么它将是。但是,如果需要,类型检查器将回退到强制可选。此行为的影响是任何表达式的结果引用声明为T的值!要么是T型还是T型?例如,在以下代码中:

let x: Int! = 5
let y = x
let z = x + 0
     

... x被声明为IUO,但因为y类型的初始化器正确地检查为可选,所以y将被绑定为Int?类型。但是,z的初始化程序不会使用声明为可选的x进行类型检查(没有带有可选的+的重载),因此编译器强制可选和类型检查初始化程序为Int。

在您的情况下,作业

let foo = implicitlyUnwrappedOptionalString

使foo成为一个强大的可选项,例如let y = x 从提案中。

可以通过添加显式类型注释使foo成为IUO

let foo: String! = implicitlyUnwrappedOptionalString

但通常你应该尝试摆脱代码中的IUO, 如同一提案中所述:

  

除了一些特定情况,选项总是更安全的选择,我们希望鼓励人们使用它们而不是IUO。

相关问题