警告
2.2 版本处于实验性状态。之前使用类似方法的方法在某些机器/ Swift 版本上不起作用。这种新的方法应该对不同 Swift 版本如何布局字节具有弹性。然而,这个版本依赖于 Swift 在 Mirror 中对待枚举(带有和无关联值)的方式。
如果您遇到问题,请让我知道,同时请使用版本 2.1,它依赖于 description 来获取枚举案件名称,或使用版本 1.4,它使用手动方法处理枚举相等性。
AutoEquatable
AutoEquatable 是符合 Swift 协议 Equatable 的便捷方法。
AutoEquatable
协议通过比较对象的所有存储属性来工作。仍然可以实自定义 ==()
函数,并且 AutoEquatable
将使用该自定义实现,而不是 AutoEquatable
的默认属性比较。
在 AutoEquatable 之前
class MyClass: Equatable {
let myString: String
let myInt: Int
let myDouble: Double
let myOptional: String?
let myTuple: (String, Int)
let myFunction: (String) -> Bool // functions are ignored when comparing objects
let myStruct: MyStruct
let myEnum: MyEnum
public static func == (lhs: MyClass, rhs: MyClass) -> Bool {
return lhs.myString == rhs.myString
&& lhs.myInt == rhs.myInt
&& lhs.myDouble == rhs.myDouble
&& lhs.myOptional == rhs.myOptional
&& lhs.myTuple == rhs.myTuple
&& lhs.myStruct == rhs.myStruct
&& lhs.myEnum == rhs.myEnum
}
}
struct MyStruct: Equatable {
let aString: String
let anInt: Int
let aTuple: (Int, String)
public static func == (lhs: AStruct, rhs: AStruct) -> Bool {
return lhs.aString == rhs.aString
&& lhs.anInt == rhs.anInt
&& lhs.aTuple == rhs.aTuple
}
}
enum MyEnum: Equatable {
case one
case two(String)
case three(String, Int, Double)
public static func == (lhs: MyEnum, rhs: MyEnum) -> Bool {
switch (lhs, rhs) {
case (.one, .one):
return true
case (.two(let a), two(let b)):
return return a == b
case (.three(let a1, a2, a3), three(let b1, b2, b3)):
return a1 == b1 && a2 == b2 && a3 == b3
case (.one, _): return false
case (.two, _): return false
case (.three, _): return false
}
}
}
在AutoEquatable之后
class MyClass: AutoEquatable {
let myString: String
let myInt: Int
let myDouble: Double
let myOptional: String?
let myTuple: (String, Int)
let myFunction: (String) -> Bool // functions are ignored when comparing objects
let myStruct: MyStruct
let myEnum: MyEnum
}
struct MyStruct: AutoEquatable {
let aString: String
let anInt: Int
let aTuple: (Int, String)
}
enum MyEnum: AutoEquatable {
case one
case two(String)
case three(String, Int, Double)
}
可选参数
没有必要让Optional遵守AutoEquatable
,这样做将会导致致命错误。这是因为可选参数已经由AutoEquatable
处理,允许它会引起副作用。
测试
要查看和运行AutoEquatable
的测试,请下载playground并运行。测试是使用Deft编写的。
要求
- Xcode 8及以上
- Swift 3及以上
安装
AutoEquatable可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
platform :ios, "9.0"
use_frameworks!
target "<YOUR_TARGET>" do
pod "AutoEquatable"
end
作者
布莱恩·雷德博,[email protected]
许可协议
AutoEquatable 可在 MIT 许可证下使用。有关更多信息,请参阅 LICENSE 文件。