检查键中是否存在键[类型:类型?]

时间:2015-03-27 11:33:13

标签: swift

如何检查字典中是否存在密钥?我的字典是[Type:Type?]类型。

我无法简单地检查dictionary[key] == nil,因为价值可能是nil

有什么想法吗?

7 个答案:

答案 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)

如建议的thishere一样,最好的解决方案是使用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更有效,因为它必须在搜索之前创建整个数组。