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

在Swift 4.2中,IUO作为字典键

  •  -1
  • Cristik  · 技术社区  · 6 年前

    以下代码在Swift 4.2(Xcode 10)中的行为不再与在Swift 4.1(Xcode 9.4.1)中的行为相同:

    let key: String! = "key"
    let dict: [AnyHashable:Any]? = ["key":"value"]
    let val = dict?[key]
    

    在Swift 4.1中, val 接收字典值(“value”),而在Swift 4.2中为零。

    如果我移除 (IUO),或将字典声明为 [String:Any] ,所以两者

    let key: String = "key"
    let dict: [AnyHashable:Any]? = ["key":"value"]
    let val = dict?[key]
    

    let key: String! = "key"
    let dict: [String:Any]? = ["key":"value"]
    let val = dict?[key]
    

    导致 瓦尔

    这是Swift 4.2中的预期行为,还是编译器错误?

    因为我有一个巨大的代码库,密钥和字典都来自Objective-C代码,这有点难以更改。所以我想知道这种行为上的改变是否是永久性的,我应该开始更新使用这种模式的代码中的许多地方,或者只是等到Xcode 10的稳定版本发布。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Papershine    6 年前

    有人提议 SE-0054 哪一个 已完全实施 在Swift 4.2中。在过去,有一种 ImplicitlyUnwrappedOptional 它的功能不同于Swift 4.2(现在所有的IUO都是 Optional 输入Swift 4.2,而不是 隐式修饰

    从提案(重点是我的提案):

    如果表达式可以用 可选类型。然而, 类型检查器将返回到 必要时强制执行可选 任何引用声明为T的值的表达式的结果! 是T型还是T型?。例如,在下面 代码:

    let x: Int! = 5
    let y = x
    let z = x + 0
    

    x被宣布为IUO,但是 将被绑定为Int?类型?。但是,z的初始值设定项没有 将x声明为可选的类型检查(不存在+ 它接受一个optional),所以编译器强制使用optional和type

    在你的情况下 key 变量被推断为类型 String?

    let val = dict?[key!]
    

    val 有价值 Optional("value")

    至于为什么 [String:Any] 根据引用的重点部分, 不能用在 String ,因此编译器将强制展开它(让它编译是必要的)。