确定Swift字典是否包含密钥并获取其任何值

时间:2015-01-24 19:30:52

标签: swift dictionary

我目前正在使用以下(笨拙的)代码来确定(非空)Swift字典是否包含给定密钥以及从同一字典中获取一个(任何)值。

如何在Swift中更优雅地使用它?

// excerpt from method that determines if dict contains key
if let _ = dict[key] {
    return true
}
else {
    return false
}

// excerpt from method that obtains first value from dict
for (_, value) in dict {
    return value
}

7 个答案:

答案 0 :(得分:409)

您不需要任何特殊代码来执行此操作,因为这是字典已经执行的操作。当您获取dict[key] 知道字典是否包含密钥时,因为您获取的可选项不是nil(并且它包含值)。

因此,如果只是想要回答字典是否包含密钥的问题,请询问:

let keyExists = dict[key] != nil

如果你想要这个值并且知道字典包含密钥,请说:

let val = dict[key]!

但是,如果通常情况下,你不知道它包含密钥 - 你想要获取它并使用它,但只有它存在 - 然后使用类似if let的东西:

if let val = dict[key] {
    // now val is not nil and the Optional has been unwrapped, so use it
}

答案 1 :(得分:41)

为什么不直接检查dict.keys.contains(key)? 如果值为零,则检查dict[key] != nil将不起作用。 与字典[String: String?]一样。

答案 2 :(得分:23)

如果Dictionary包含键但值为nil,则接受的答案let keyExists = dict[key] != nil将不起作用。

如果你想确保Dictionary完全不包含密钥,请使用它(在Swift 4中测试)。

if dict.keys.contains(key) {
  // contains key
} else { 
  // does not contain key
}

答案 3 :(得分:5)

看起来你从@matt得到了你需要的东西,但是如果你想快速获取一个键的值,或者只是第一个值,如果该键不存在:

extension Dictionary {
    func keyedOrFirstValue(key: Key) -> Value? {
        // if key not found, replace the nil with 
        // the first element of the values collection
        return self[key] ?? first(self.values)
        // note, this is still an optional (because the
        // dictionary could be empty)
    }
}

let d = ["one":"red", "two":"blue"]

d.keyedOrFirstValue("one")  // {Some "red"}
d.keyedOrFirstValue("two")  // {Some "blue"}
d.keyedOrFirstValue("three")  // {Some "red”}

注意,不保证你实际得到的是第一个值,在这种情况下只会发生返回“红色”。

答案 4 :(得分:2)

if dictionayTemp["quantity"] != nil
    {

  //write your code
    }

答案 5 :(得分:0)

我的缓存实现解决方案,存储可选的NSAttributedString:

public static var attributedMessageTextCache    = [String: NSAttributedString?]()

    if attributedMessageTextCache.index(forKey: "key") != nil
    {
        if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
        {
            return attributedMessageText
        }
        return nil
    }

    TextChatCache.attributedMessageTextCache["key"] = .some(.none)
    return nil

答案 6 :(得分:0)

这对我在Swift 3上的作用

let _ = (dict[key].map { $0 as? String } ?? "")