我很好奇隐式解包选项的工作方式,在 Apple 引用书 - The Swift Programming Language 中指出:
“If you try to access an implicitly unwrapped optional when it does not contain a value, you will trigger a runtime error. The result is exactly the same as if you place an exclamation mark after a normal optional that does not contain a value.”
如果我尝试访问一个没有感叹号的无值可选,您会收到如上所述的错误。
var optionalVar:String?
println("VAR: \(optionalVar!)")
但是,如果您尝试访问一个不包含值的隐式解包可选,则 println 输出 VAR: nil,这不是上面所说的。
var implicitOpt:String!
println("VAR: \(implicitOpt)")
任何人都可以澄清这一点,它是措辞糟糕的文档,我想念理解,一个错误吗?
请您参考如下方法:
问题是在这种情况下您没有展开值,而是将展开的可选值打印为特殊类型。很奇怪,我知道。尝试将其转换为普通的 String ,如果 nil 它将崩溃:
var implicitOpt: String!
println("VAR: \(implicitOpt as String)")
下面几行是等价的:
var implicitOpt: ImplicitlyUnwrappedOptional<String>
var implicitOpt: String!
ImplicitlyUnwrappedOptional 符合 Printable 协议(protocol)。所以字符串插值
"\(implicitOpt)"
将在 ImplicitlyUnwrappedOptional 实例上调用 description,而不是 String 实例。这就是为什么在这种情况下不展开可选的。
