Swift Dictionary default value

前端 未结 3 1337
走了就别回头了
走了就别回头了 2020-12-06 18:31

A pattern I\'ve gotten used to with Python\'s defaultdicts is a dictionary that returns a default value if the value for a given key has not been explicitly set. Trying to d

3条回答
  •  眼角桃花
    2020-12-06 19:14

    Unless I'm misunderstanding defaultdict in Python, I don't see how nil coalescing wouldn't work for you. Let's say you had a dictionary of type [Int:Int], and you wanted it to return 0 by default. With nil coalescing it looks like this:

    let dict = [1:10, 2:8, 3:64]
    let valueForKey = dict[4] ?? 0
    

    You mentioned in a comment that that wouldn't work because it wouldn't update the dictionary. I don't understand the problem, though: why would you need to update the dictionary if you knew that every instance of nil would be replaced by your default? Maybe I'm missing something here but it seems like defaults and nil coalescing are (in practice) the same.

    You can change the syntax a little, if it makes things more clear:

    extension Dictionary {
      subscript(key: Key, or r: Value) -> Value {
        get { return self[key] ?? r }
        set { self[key] = newValue }
      }
    }
    

    In this case, the example above could be written like this:

    let dict = [1:10, 2:8, 3:64]
    let valueForKey = dict[4, or: 0]
    

    In this case, mutating methods can work on the keys, like this:

    var dict = [2: 8, 3: 64, 1: 10]
    dict[2, or: 0]++
    dict // [2: 9, 3: 64, 1: 10]
    dict[4, or: 0]++
    dict // [2: 9, 3: 64, 1: 10, 4: 1]
    

提交回复
热议问题