在 Java 中,可以使用AutoValue库为值对象自动生成toString()
、hashCode()
和的实现。优点是(除其他外)这些方法在添加新字段时会自动更新。我的问题是 Swift 是否有等效的功能(内置或作为库)?equals(Object)
例子
一个简单的例子,展示了 Swift 的现状。考虑以下结构:
struct PlainStruct {
let a:String
let b:Int
let c:Double
}
为了让它符合Hashable
我修改它如下:
struct HashableStruct : Hashable {
let a:String
let b:Int
let c:Double
var hashValue: Int {
return 5381 &+ a.hashValue &+ b.hashValue &+ c.hashValue
}
static func ==(lhs: HashableStruct, rhs: HashableStruct) -> Bool {
return lhs.a == rhs.a
&& lhs.b == rhs.b
&& lhs.c == rhs.c
}
}
添加的代码虽然很简单,但给程序员带来了额外的负担,尤其是当软件进一步发展时(就像通常那样)。理想情况下,我希望能够简单地向结构添加一个属性(如 Java 中的注释):
@autovalue
struct HashableStruct : Hashable {
let a:String
let b:Int
let c:Double
}
目前这是不可能的,因为无法在 Swift 中指定自定义属性。有没有另一种方法可以在 Swift 中实现这一点?
Java 中 AutoValue 的动机
以下文本来自AutoValue页面,它激发了创建 AutoValue 的原因。我希望同样的推理适用于 Swift 的上下文,但我在 Swift 中的经验不如在 Java 中的经验,所以如果我错了,请纠正我。
值类在 Java 项目中极为常见。这些是您希望将具有适当相等字段值的任何两个实例视为可互换的类。没错:我们谈论的是那些最终以臃肿、重复、公式化但容易出错的方式实现 equals、hashCode 和 toString 的类。
第一次编写这些方法还不错,借助一些辅助方法和 IDE 模板。但是一旦写出来,它们就会继续给审稿人、编辑和未来的读者带来负担。他们广泛的样板代码大大降低了代码的信噪比……而且他们喜欢隐藏难以发现的错误。
AutoValue 提供了一种更简单的方法来创建不可变值类,代码更少,出错空间更小,同时不会限制您按照您想要的方式对类的几乎任何方面进行编码的自由。