AutoEquatable 2.4

AutoEquatable 2.4

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2019年8月
SPM支持 SPM

Rivukis 维护。



  • Brian Radebaugh

警告

2.2 版本处于实验性状态。之前使用类似方法的方法在某些机器/ Swift 版本上不起作用。这种新的方法应该对不同 Swift 版本如何布局字节具有弹性。然而,这个版本依赖于 Swift 在 Mirror 中对待枚举(带有和无关联值)的方式。

如果您遇到问题,请让我知道,同时请使用版本 2.1,它依赖于 description 来获取枚举案件名称,或使用版本 1.4,它使用手动方法处理枚举相等性。

AutoEquatable

Version License Platform

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 文件。