如何检查字典中是否存在密钥?我的字典是[Type:Type?]
类型。
我无法简单地检查dictionary[key] == nil
,因为价值可能是nil
。
有什么想法吗?
答案 0 :(得分:65)
实际上您的测试dictionary[key] == nil
可以用于检查
如果字典中存在密钥。如果值,它将不会产生true
设置为nil
:
let dict : [String : Int?] = ["a" : 1, "b" : nil]
dict["a"] == nil // false, dict["a"] is .Some(.Some(1))
dict["b"] == nil // false !!, dict["b"] is .Some(.None)
dict["c"] == nil // true, dict["c"] is .None
要区分"密钥不存在于dict"和"密钥的值是零"您 可以执行嵌套的可选赋值:
if let val = dict["key"] {
if let x = val {
println(x)
} else {
println("value is nil")
}
} else {
println("key is not present in dict")
}
答案 1 :(得分:37)
我相信词典类型indexForKey(key: Key)
是你正在寻找的。它返回给定键的索引,但更重要的是对于您的建议,如果它无法在字典中找到指定的键,则返回nil。
if dictionary.indexForKey("someKey") != nil {
// the key exists in the dictionary
}
Swift 3语法......
if dictionary.index(forKey: "someKey") == nil {
print("the key 'someKey' is NOT in the dictionary")
}
答案 2 :(得分:3)
你总是可以这样做:
let arrayOfKeys = dictionary.allKeys
if arrayOfKeys.containsObject(yourKey) {
}
else {
}
但是我真的不喜欢创建一个可以包含选项的NSDictionary。
答案 3 :(得分:1)
试试这个:
let value = dict[key] != nil
希望它对你有用。感谢
答案 4 :(得分:0)
如建议的this和here一样,最好的解决方案是使用Dictionary.index(forKey:)
并返回Dictionary<Key, Value>.Index?
。无论您的值是否为可选类型,它都会返回一个可选索引,如果为nil
,则它将明确告诉您该键是否存在于字典中。这比使用Dictionary.contains(where:)
的效率要高得多。.containsKey()
被证明具有“复杂度O( n ),其中 n 是长度的顺序。”
因此,一种更好的写extension Dictionary {
func contains(key: Key) -> Bool {
self.index(forKey: key) != nil
}
}
的方法是:
http://site-url/ngsw/state
我们建议您使用above,因此,如果您愿意,可以随时使用它。
答案 5 :(得分:-1)
这对我有用[Swift 3.0]:
let myVar = "c"
let myDict: [String: Int] = ["a": 0, "b": 1, "c": 2]
if myDict.keys.contains(myVar) {
print(myVar)
} else {
print("ERROR")
}
答案 6 :(得分:-1)
我在Swift 4中以这种方式处理它:
extension Dictionary {
func contains(key: Key) -> Bool {
let value = self.contains { (k,_) -> Bool in key == k }
return value
}
}
这使用Dictionary.contains(where: (key: Hashable, value: Value) throws -> Bool)
。通过将其封装为扩展,我可以很好地将实现更新为更好的代码,而无需修改代码。我正在避免创建index(forKey:Key)
所做的数据。我希望它比访问keys
更有效,因为它必须在搜索之前创建整个数组。