确定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 }