【问题标题】:Implicitly unwrapped optional assign in Xcode 8Xcode 8 中隐式展开的可选赋值
【发布时间】:2017-01-30 16:52:41
【问题描述】:

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

这里是代码,

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

print(implicitlyUnwrappedOptionalString)
print(foo)

结果如下:

implicitlyUnwrappedOptionalString
Optional("implicitlyUnwrappedOptionalString")

以上这些表明,当我将 隐式展开的可选 分配给没有显式类型的变量时,该类型将被推断为可选类型,而不是原来的类型,即 隐式展开的可选

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

变化是由于 Swift 版本变化还是 Xcode?​​p>

【问题讨论】:

标签: ios swift xcode


【解决方案1】:

这是 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多