Determining if Swift dictionary contains key and obtaining any of its values

前端 未结 7 1556
离开以前
离开以前 2020-11-30 17:04

I am currently using the following (clumsy) pieces of code for determining if a (non-empty) Swift dictionary contains a given key and for obtaining one (any) value from the

相关标签:
7条回答
  • 2020-11-30 17:48

    My solution for a cache implementation that stores optional 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
    
    0 讨论(0)
  • 2020-11-30 17:49

    Here is what works for me on Swift 3

    let _ = (dict[key].map { $0 as? String } ?? "")
    
    0 讨论(0)
  • 2020-11-30 17:53
    if dictionayTemp["quantity"] != nil
        {
    
      //write your code
        }
    
    0 讨论(0)
  • 2020-11-30 17:54

    Looks like you got what you need from @matt, but if you want a quick way to get a value for a key, or just the first value if that key doesn’t exist:

    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”}
    

    Note, no guarantees what you'll actually get as the first value, it just happens in this case to return “red”.

    0 讨论(0)
  • 2020-11-30 18:09

    You don't need any special code to do this, because it is what a dictionary already does. When you fetch dict[key] you know whether the dictionary contains the key, because the Optional that you get back is not nil (and it contains the value).

    So, if you just want to answer the question whether the dictionary contains the key, ask:

    let keyExists = dict[key] != nil
    

    If you want the value and you know the dictionary contains the key, say:

    let val = dict[key]!
    

    But if, as usually happens, you don't know it contains the key - you want to fetch it and use it, but only if it exists - then use something like if let:

    if let val = dict[key] {
        // now val is not nil and the Optional has been unwrapped, so use it
    }
    
    0 讨论(0)
  • 2020-11-30 18:09

    Why not simply check for dict.keys.contains(key)? Checking for dict[key] != nil will not work in cases where the value is nil. As with a dictionary [String: String?] for example.

    0 讨论(0)
提交回复
热议问题