我有一个关联值的枚举,为了测试的目的,我想使其相等,但不知道这个模式如何处理带有多个参数的枚举情况.

例如,总结如下,我知道使标题相等的语法.对于包含多个不同类型值的选项,这将如何工作?

enum ViewModel {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
}

func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
    switch (lhs, rhs) {
    case (let .heading(lhsString), let .heading(rhsString)):
        return lhsString == rhsString
    case options...
    default:
        return false
    }
}

我知道Swift 4.1可以为我们合成Equalable的一致性,但目前我无法更新到这个版本.

推荐答案

SE-0185 Synthesizing Equatable and Hashable conformance已在Swift 4.1中实现,因此它足以满足协议的do declare一致性(如果所有成员都是Equatable):

enum ViewModel: Equatable {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
}

对于早期的Swift版本,一个方便的方法是使用tuples==进行比较.

许多人还希望在Swift版本判断中附上兼容性代码,以便在项目更新为Swift 4.1后使用自动合成:

enum ViewModel: Equatable {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
    
    #if swift(>=4.1)
    #else
    static func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
        switch (lhs, rhs) {
        case (let .heading(lhsString), let .heading(rhsString)):
            return lhsString == rhsString
        case (let .options(lhsId, lhsTitle, lhsEnabled), let .options(rhsId, rhsTitle, rhsEnabled)):
            return (lhsId, lhsTitle, lhsEnabled) == (rhsId, rhsTitle, rhsEnabled)
        default:
            return false
        }
    }
    #endif
}

Swift相关问答推荐

显示第二个操作紧接在另一个操作后的工作表在SwiftUI中不起作用

通常从数组调用的SWIFT静态协议函数

SwiftUI:为什么@State在子视图中持续存在?

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

在不传递参数的情况下使用Init方法?

从Swift中的泛型类继承?

deinitialize() 与 deallocate()

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

为什么 id 不能通过 struct 从 Objective-C 移植到 Swift?

Swift - 订阅视图之外的绑定值

持久化字符串列表属性 RealmSwift

故事板未在助手中显示视图控制器

仅在 Swift 中创建 Setter

'NSLog' 不可用:可变参数函数在 swift 中不可用

无法分配给属性:self 是不可变的,我知道如何修复但需要理解

即使设置为从不也可以访问 iOS11 照片库

Swift 中 NSFetchRequest 的多个 NSPredicates?

Swift - 导入我的 swift 类

如何在 SwiftUI 中以编程方式滚动列表?

如何判断 firebase 数据库值是否存在?