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

我目前正在使用以下(笨拙的)代码片断来确定(非空)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 } 

你不需要任何特殊的代码来做到这一点,因为这是一本字典已经做了什么。 当你获取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 } 

为什么不简单检查dict.keys.contains(key) ? 在值为零的情况下,检查dict[key] != nil将不起作用。 与字典[String: String?]例如。

看起来你从@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”} 

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

我的caching实现存储可选的NSAttributedString的解决scheme:

 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 

这是什么在Swift 3上适合我

 let _ = (dict[key].map { $0 as? String } ?? "") 
 if dictionayTemp["quantity"] != nil { //write your code }