说我有以下代码:
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 `!`
答案 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)