字典<anyhashable:any =“”>其中Any可以在Swift 3中保存nil值

时间:2016-12-12 21:40:16

标签: swift swift3 swift-dictionary

有人可以解释为什么这在Swift 3中有效吗?

var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any

dict = ["a": "aa", "b": c]

如果我测试

dict["b"] == nil

返回false。它应该是对的吗?

2 个答案:

答案 0 :(得分:1)

您正在遇到嵌套的选项。如果字典包含类型E,则字典访问方法返回类型E?的值,如果值存在,则返回nil。

在您的情况下,您已经创建了一个字典,其中值是可选的。所以上面的E类似Any?。这意味着getter的返回值为E?,即Any??

在您的情况下,dict["b"]会返回一个非零可选项,其中包含值'nil'

将代码放入游乐场并打印dict["b"]通过打印字符串Optional(nil)

来确认

答案 1 :(得分:1)

假设您使用的是最新的Xcode,8.1(8B62)和Swift 3.0.1。

包含Any

nil并不像简单的嵌套可选项那么容易:

嵌套可选

var dictWithOptional: [String: AnyObject?] = [
    "a": "aa" as NSString,
    "b": nil,
]
if let b = dictWithOptional["b"] { //<-check if `dict` contains value for "b"
    print(b) //->nil (with compiletime warning)
    print(b == nil) //->true
}

b == nil返回true

Any包含nil

var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any
dict = ["a": "aa", "b": c]

print(Array(dict.keys)) //->[AnyHashable("b"), AnyHashable("a")]
if let b = dict["b"] { //<-check if `dict` contains value for "b"
    print(b) //->nil
    print(b == nil) //->false (with compiletime warning)
}

b == nil变为false由OP编写。

您可以使用以下内容检测nil中的Any

if let b = dict["b"] { //<-check if `dict` contains value for "B"
    if b as AnyObject === NSNull() {
        print("b is nil") //->b is nil
    }
}

(这适用于Swift 3.0.1,而不适用于Swift 3.0.0。)