3

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

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

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

如果我测试

dict["b"] == nil

它返回假。它应该是正确的吗?

4

2 回答 2

2

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

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

在您的情况下,dict["b"]返回一个非零可选,包含值“零”

将您的代码放在操场上并打印dict["b"]通过打印字符串来确认这一点Optional(nil)

于 2016-12-12T22:08:16.147 回答
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变成falseOP所写的。

您可以通过以下方式检测nilAny

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 中无效。)

于 2016-12-12T22:41:42.417 回答