在Xcode 8中隐式解包可选分配
在Xcode 8发布版本中,我发现了一个奇怪的场景。
这里是代码,
let implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString" let foo = implicitlyUnwrappedOptionalString print(implicitlyUnwrappedOptionalString) print(foo)
这是结果:
implicitlyUnwrappedOptionalString Optional("implicitlyUnwrappedOptionalString")
这些上面显示,当我分配一个隐式unwrapped可选的variables没有显式types,types将被推断为一个可选的types,而不是它原来的types,又名隐式unwrapped可选 。
我的Xcode已经更新到8.任何人都可以validation在Xcode 7.x中的行为?
更改是由于Swift版本更改或Xcode?
这是SE-0054废除ImplicitlyUnwrapped可选types的结果 ,已经在Swift 3中实现。从该提议中提取(强调添加):
但是,外观! 在属性或variables声明types的末尾不再表示声明具有IUOtypes; 相反,它表示(1)声明有可选的types,(2)声明有一个属性,表明它的值可能被强制强制。 …
如果expression式可以使用强可选types进行显式types检查,则会是。 但是,如果需要的话,types检查器将回退到强制选项。 这种行为的影响是任何expression式的结果引用一个声明为T的值! 会有T型还是T型? 例如,在以下代码中:
let x: Int! = 5 let y = x let z = x + 0
… x被声明为一个IUO,但是因为ytypes的初始值设定项正确地检查为可选项,所以y将被绑定为typesInt ?. 然而,z的初始化方法并没有用x声明为可选的types检查(没有重载+的可选方法),所以编译器强制使用可选types来检查初始值为Int。
在你的情况下,分配
let foo = implicitlyUnwrappedOptionalString
使foo
成为一个强有力的可选项,例如在提案中let y = x
。
你可以通过添加一个明确的types注释来使foo
成为一个IUO
let foo: String! = implicitlyUnwrappedOptionalString
但一般来说,您应该尝试从代码中清除IUO,如同一个提议中所述:
除了一些特定的情况,可选项总是比较安全的,我们希望鼓励人们使用它们而不是IUO。