代码之家  ›  专栏  ›  技术社区  ›  allaire

init vs later中的隐式WrappedOptional

  •  5
  • allaire  · 技术社区  · 8 年前

    我想知道为什么我没有 ImplicitlyUnwrappedOptional 当我这样做的时候 params["bar"] = str 但我在申报时就知道了 params 使用相同的力展开变量。

    请看下面的操场:

    import UIKit
    
    var str: String!
    
    str = "Hello"
    
    var params: [String: Any] = [
        "foo": str
    ]
    
    params["bar"] = str
    
    print(params)
    
    // ["bar": "Hello", "foo": Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("Hello")]
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Hamish    8 年前

    在Swift 4.1中,当您执行以下操作时:

    var str: String!
    
    str = "Hello"
    
    var params: [String: Any] = [
        "foo": str
    ]
    

    这个 ImplicitlyUnwrappedOptional (IUO)值强制为 Any ,这就是它在词典中显示为IUO的原因。它不会强制展开,因为编译器只会在上下文要求其展开类型时强制展开IUO,而在 任何

    然而,事实上,你最终 隐式包装 价值 是遗留行为。在Swift 4.2中删除IUO类型后,您将获得 Optional 改为在字典中输入值,它将打印为 Optional("Hello")

    本问答中对上述行为有更多讨论;答:

    当你这样做的时候:

    params["bar"] = str
    

    你在用 Dictionary subscript(key: Key) -> Value? ,需要 可选择的 值执行删除,如果 nil 传递,否则插入未包装的值。

    • 在Swift 4.1中,IUO值 str 将隐式转换为 可选择的 然后可以将其传递到下标。
    • 在Swift 4.2中,已删除IUO类型,因此 str公司 已经 可选择的 ,可以直接传递到下标,无需任何中间转换。

    在这两种情况下, str公司 的未包装值被插入到字典中,这就是为什么您将其视为未包装。如果 str公司 曾经是 ,键没有值 "bar" 将被插入。