【发布时间】:2020-08-19 09:39:53
【问题描述】:
我写了一个简单的协议Data:
public protocol Data {
var state: [String: Any] { get set }
var objectId: String? { get set }
}
public extension Data {
var objectId: String? {
get {
return self.state["objectId"] as? String
}
set {
self.state["objectId"] = newValue
}
}
}
这样,我创建了几种符合它的类型:
public struct Person: Data {
public var state: [String : Any]
}
public struct Car: Data {
public var state: [String : Any]
}
// ...
现在我要做的就是让这些类型中的每一个Hashable,问题是我需要在每个类型中编写这段代码:
extension Car Hashable {
public static func == (lhs: Car, rhs: Car) -> Bool {
return lhs.objectId == rhs.objectId
}
public func hash(into hasher: inout Hasher) {
hasher.combine(self.objectId ?? "")
}
}
// ...
我想知道的是是否可以从其objectId 中将Data 一般声明为Hashable。由于我使用的是协议,所以我找不到这样做的方法。
感谢您的帮助。
【问题讨论】:
-
使用
[String:Any]会破坏Hashable一致性的自动综合。将state存储为[String:Any]是一个非常糟糕的主意。 -
数据是原生的 Swift 类型,你应该为你的协议使用另一个名字