【问题标题】: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)")

谁能澄清一下,是不是措辞不好的文档,我想念理解,一个错误?

【问题讨论】:

    标签: ios swift optional


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 2014-07-23
      相关资源
      最近更新 更多