为什么隐式解包的变量现在在Swift 4.1中打印出一些(...)?

时间:2018-04-01 15:15:08

标签: swift

说我有以下代码:

var aString: String!
aString = "second"
print(aString)

这将打印出some("second")。如果我从!删除String,则会打印出second。这个some(...)的添加从未在Swift 4中发生过,为什么这个突然发生在4.1?有没有理由我现在需要将其保留为String!而不是String

修改

刚刚找到了保留感叹号的理由 - 如果我有一个if子句而没有else,我的代码肯定不知道它已被解包。我该如何处理这种情况:

var aString: Int!
let aBool = true
if aBool {
    aString = 2
}

print(aString) // Prints some(2), crashes if I remove the `!`

1 个答案:

答案 0 :(得分:0)

String!是一个隐式解包的可选项,但它仍然是可选

只有在需要解包的情况下才会将值展开为非可选值,例如当传递给一个不能选择的函数时。但是,print可以接受可选项,String!将被视为String?

此更改实际上已在Swift 3中作为SE-0054的一部分发生。

在你的例子中:

var aString: Int!
let aBool = true
if aBool {
    aString = 2
}

print(aString)

您不应该使用隐式展开的可选项,因为它是var,它会初始化为nil。您应该使用Int?显式处理未分配的案例,或者给它一个默认值:

let aString: Int
let aBool = true
if aBool {
    aString = 2
} else {
    aString = 0
}

print(aString)