我很好奇隐式解包选项的工作方式,在Apple参考书中 - Swift编程语言它指出:
“如果你尝试访问一个隐式解包的可选项 如果不包含值,则会触发运行时错误。结果是 与在正常情况下放置感叹号完全相同 可选的,不包含值。“
如果我尝试访问没有感叹号的无值可选项,则会出现上述错误。
var optionalVar:String?
println("VAR: \(optionalVar!)")
但是,如果您尝试访问一个不包含值的隐式展开的可选项,则println将输出VAR: nil
,而不是上述内容。
var implicitOpt:String!
println("VAR: \(implicitOpt)")
任何人都可以澄清一下,这是文件措辞严厉,我不理解,错误吗?
答案 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"