在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。