Skip to main content
 首页 » 操作系统

ios之访问无值(value)的隐式解包可选

2024年01月01日48fff_TT

我很好奇隐式解包选项的工作方式,在 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 实例。这就是为什么在这种情况下不展开可选的。