Dictionary<AnyHashable: Any> where Any may hold nil value in Swift 3
Dictionary<AnyHashable: Any> where Any may hold nil value in Swift 3
有人可以解释为什么这在 Swift 3 中有效吗?
var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any
dict = ["a": "aa", "b": c]
如果我测试
dict["b"] == nil
它returns 错误。它应该是正确的吗?
您 运行 喜欢嵌套的可选值。如果字典包含类型 E
,则字典访问方法 return 是类型 E?
的值,如果存在则为值,或者为 nil。
在您的例子中,您创建了一个字典,其中的值是可选的。所以上面的 E
类似于 Any?
。这意味着 getter 的 return 值是 E?
即 Any??
在您的例子中,dict["b"]
return 是一个非零可选,包含值 'nil'
将您的代码放在操场上并打印 dict["b"]
通过打印字符串 Optional(nil)
来确认这一点
假设您使用的是最新的 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
returns 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 所写。
你可以在 Any
中检测到 nil
,像这样:
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。)
有人可以解释为什么这在 Swift 3 中有效吗?
var dict: [AnyHashable: Any]
let b: AnyObject? = nil
let c = b as Any
dict = ["a": "aa", "b": c]
如果我测试
dict["b"] == nil
它returns 错误。它应该是正确的吗?
您 运行 喜欢嵌套的可选值。如果字典包含类型 E
,则字典访问方法 return 是类型 E?
的值,如果存在则为值,或者为 nil。
在您的例子中,您创建了一个字典,其中的值是可选的。所以上面的 E
类似于 Any?
。这意味着 getter 的 return 值是 E?
即 Any??
在您的例子中,dict["b"]
return 是一个非零可选,包含值 'nil'
将您的代码放在操场上并打印 dict["b"]
通过打印字符串 Optional(nil)
假设您使用的是最新的 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
returns 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 所写。
你可以在 Any
中检测到 nil
,像这样:
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。)