访问无价值的隐式解包可选?

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 方法中的隐式解包选项

可选类型的值必须被解包以引用成员,但它是隐式解包的可选属性

#5 kotlin nullable 可空类型

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

无法解包可选。没有 UITableViewCell

不需要在 Swift 中解开选项?