覆盖Swift中字典的默认行为以忽略零值?

时间:2015-03-10 15:01:21

标签: swift dictionary override

我想创建一个像Dictionary一样的数据类型,但忽略任何值为零的键,例如考虑一个假设的例子:

typealias SpecialDict = Dictionary<String,Int>
let testA: SpecialDict = ["a":1, "b":4, "c":0]
let testB: SpecialDict = ["a":1, "b":4]
testA == testB // should evaluate as true

我不确定是否更好:

  • override ==提供此行为,每次比较两个词典时都会付出代价
  • 覆盖updateValue(_:forKey :),这样每当我们尝试将值设置为0时,它只会从字典中删除相应的键(首选)
  • 完全尝试不同的数据类型

或者,使用固定的键列表创建字典的方法(即,您无法添加或删除键,只需更改其值)也可以。

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法是创建自己的struct,其行为方式符合您的要求。我会做这样的事情:

struct MyDict {

    private var dictionary = [String: Int]()

    subscript(key: String) -> Int? {
        get {
            return dictionary[key]
        }
        set {
            if newValue! != 0 {
                dictionary[key] = newValue
            } else {
                dictionary.removeValueForKey(key)
            }
        }
    }
}

但请记住,这个结构 NOT 是一个字典,所以你必须实现你需要的每个功能。