访问无价值的隐式解包可选?
Posted
技术标签:
【中文标题】访问无价值的隐式解包可选?【英文标题】:Accessing valueless implicitly unwrapped optional? 【发布时间】:2014-10-14 11:12:26 【问题描述】:我很好奇隐式解包选项的工作方式,在 Apple 参考书 - The Swift Programming Language 中它指出:
“如果您尝试访问隐式展开的可选选项 不包含值,您将触发运行时错误。结果是 就像你在一个正常的后面加一个感叹号一样 不包含值的可选。”
如果我尝试访问不带感叹号的无价值可选项,则会出现上述错误。
var optionalVar:String?
println("VAR: \(optionalVar!)")
但是,如果您尝试访问不包含值的隐式解包可选项,则 println 会输出 VAR: nil
,这与上述内容不同。
var implicitOpt:String!
println("VAR: \(implicitOpt)")
谁能澄清一下,是不是措辞不好的文档,我想念理解,一个错误?
【问题讨论】:
【参考方案1】:问题是在这种情况下您没有解包该值,而是将解包的可选项打印为特殊类型。很奇怪,我知道。尝试将其转换为正常的String
,如果nil
,它将崩溃:
var implicitOpt: String!
println("VAR: \(implicitOpt as String)")
以下几行是相等的:
var implicitOpt: ImplicitlyUnwrappedOptional<String>
var implicitOpt: String!
ImplicitlyUnwrappedOptional
符合Printable
协议。所以字符串插值
"\(implicitOpt)"
将在ImplicitlyUnwrappedOptional
实例而不是String
实例上调用description
。这就是为什么在这种情况下不解包可选的原因。
【讨论】:
是的,println 似乎是一个特例——我想这是有道理的,因为它主要是一个调试工具 我猜它的字符串插值而不是 println() 准确的说。 非常感谢,我只是想仔细检查一下。【参考方案2】:当您将其定义为隐式展开的可选项时,编译器希望它已被初始化并已保存一个值。
如果您尝试对变量执行任何操作,则会引发运行时错误。 您可以观察到评估不会引发任何运行时错误,它会给您 nil(查看评估它的 if 循环)
var implicitOpt:String!
print("VAR: \(implicitOpt)")
var someValue = 10;
if let x = implicitOpt
someValue=1;
else
someValue=2
var b = implicitOpt;
b = b + "asdf"
let a = implicitOpt + "asdf"
【讨论】:
以上是关于访问无价值的隐式解包可选?的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController init 方法中的隐式解包选项