在Xcode 8发布版中,我发现了一个奇怪的场景。
这是代码,
let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString"
let foo = implicitlyUnwrappedOptionalString
print(implicitlyUnwrappedOptionalString)
print(foo)
以下是结果:
implicitlyUnwrappedOptionalString
Optional("implicitlyUnwrappedOptionalString")
以上显示当我将隐式展开的可选分配给没有显式类型的变量时,该类型将被推断为可选类型,而不是它最初的类型,即隐式解包可选。
我的Xcode已更新为8.任何人都可以验证Xcode 7.x中的行为吗?
更改是由于Swift版本更改还是Xcode? p>
答案 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。