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

标签 swift dictionary overriding

我想创建一个数据类型,它的行为类似于字典,但忽略任何值为零的键,例如考虑一个假设的例子:

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

我不确定是否更好:

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

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

最佳答案

我想说最简单的方法是创建您自己的 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)
            }
        }
    }
}

但请记住,此结构不是字典,因此您必须实现所需的每个功能。

关于swift - 覆盖 Swift 中字典的默认行为以忽略零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967100/

相关文章:

swift - 我在 SwiftUI 的文本字段上使用拐角半径和边框时遇到问题

ios - 快速解码嵌套的 jsons

python - 在不使用字典的情况下从 Python 创建 *.mat 文件

python - 将 dict 写入 csv 文件,其中键不按字母顺序排列

swift 2.0 : Override error message for superclass

ios - 如何获取模态呈现 View Controller 的 Root View 高度?

ios - 声明一个多类型数组

Java 在 Map 上使用 Map.Entry 未编译

java - Java中 'System.out.println()'与 'toString()'的连接

python - 在创建django时添加注册