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

时间:2014-10-14 11:12:27

标签: ios swift optional

我很好奇隐式解包选项的工作方式,在Apple参考书中 - Swift编程语言它指出:

  

“如果你尝试访问一个隐式解包的可选项   如果不包含值,则会触发运行时错误。结果是   与在正常情况下放置感叹号完全相同   可选的,不包含值。“

如果我尝试访问没有感叹号的无值可选项,则会出现上述错误。

var optionalVar:String?
println("VAR: \(optionalVar!)")

但是,如果您尝试访问一个不包含值的隐式展开的可选项,则println将输出VAR: nil,而不是上述内容。

var implicitOpt:String!
println("VAR: \(implicitOpt)")

任何人都可以澄清一下,这是文件措辞严厉,我不理解,错误吗?

2 个答案:

答案 0 :(得分:3)

事情是你在这种情况下不打开值,而是​​打开未包装的可选项作为特殊类型。很奇怪,我知道。尝试将其投放到普通String,如果nil

,它会崩溃
var implicitOpt: String!
println("VAR: \(implicitOpt as String)")

以下几行相同:

var implicitOpt: ImplicitlyUnwrappedOptional<String>
var implicitOpt: String!

ImplicitlyUnwrappedOptional符合Printable协议。所以字符串插值

"\(implicitOpt)"

将在description实例上调用ImplicitlyUnwrappedOptional而不是String实例。这就是为什么在这种情况下没有打开可选项。

答案 1 :(得分:0)

当你将它定义为一个隐式解包的可选项时,编译器希望它被初始化并且已经保存了一个值。

如果您尝试对变量执行任何操作,它将引发运行时错误。 你可以观察到评估没有抛出任何运行时错误,它会给你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"