如何将变量声明为 Equatable?
How to declare a variable as Equatable?
var myDict: [String: Any]
但在我的例子中 Any
实际上不是 Any
。它是 Int
或 String
。那么我应该如何声明我的 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 东西是 Int
或 String
).
这种方法的好处是它非常简单且可扩展。你要求这些价值观做你想让他们做的任何事情。如果您改用枚举,则无法做到这一点,您将被迫不断编写 switch
个案例,并且您必须确定每个 case
在每个场景中的正确行为。
像这样使用多态性意味着您可以轻松添加对 Bool
的支持,而无需编辑程序中的每个 switch
语句。多态性只是“照顾它”。
var myDict: [String: Any]
但在我的例子中 Any
实际上不是 Any
。它是 Int
或 String
。那么我应该如何声明我的 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 东西是 Int
或 String
).
这种方法的好处是它非常简单且可扩展。你要求这些价值观做你想让他们做的任何事情。如果您改用枚举,则无法做到这一点,您将被迫不断编写 switch
个案例,并且您必须确定每个 case
在每个场景中的正确行为。
像这样使用多态性意味着您可以轻松添加对 Bool
的支持,而无需编辑程序中的每个 switch
语句。多态性只是“照顾它”。