如何将变量声明为 Equatable?

How to declare a variable as Equatable?

var myDict: [String: Any]

但在我的例子中 Any 实际上不是 Any。它是 IntString。那么我应该如何声明我的 var myDict 以显示它是 Equatable

var myDict: [String: Any] where Any: Equatable //it doesn't compile

或者像这样的东西:)

如果您知道它可以是 Int 或 String,则使用 IntOrString 联合枚举类型。可以使 IntOrString 联合枚举类型相等(您甚至不需要代码,只需声明它):

enum IntOrString : Equatable {
    case int(Int)
    case string(String)
}

由于条件一致性,[String: IntOrString] 类型的字典现在将是 Equatable。

我建议创建一个协议来模拟您的类型分组,并扩展这些类型以符合该协议。

例如,假设这些整数或字符串的目的是填充 table 中的单元格。你会做这样的事情:

/// some example type that models a table cell
class Cell {
    var value: String
    
    init(value: String) { self.value = value }
}

protocol CellRepresentable {
    func populate(in: Cell)
}

extension Int: CellRepresentable {
    func populate(in cell: Cell) {
        // Don't ever format numbers for user-consumption like this
        // Use a NumberFormatter. This is for demo use only
        cell.value = String(self)
    }
}

extension String: CellRepresentable {
    func populate(in cell: Cell) {
        cell.value = self
    }
}

let myDict: [String: CellRepresentable] = [
    "key1": 1,
    "key2": "value 2",
    "key3": 3,
]

关键是设计协议来表示抽象(在这种情况下,可以用单元表示的东西),而不是过于接近具体化(例如表示的存储细节table 东西是 IntString).

这种方法的好处是它非常简单且可扩展。你要求这些价值观做你想让他们做的任何事情。如果您改用枚举,则无法做到这一点,您将被迫不断编写 switch 个案例,并且您必须确定每个 case 在每个场景中的正确行为。

像这样使用多态性意味着您可以轻松添加对 Bool 的支持,而无需编辑程序中的每个 switch 语句。多态性只是“照顾它”。