如何使带有关联值的Swift枚举可等于

Mis*_*ppi 14 enums swift equatable associated-value

我有一个关联值的枚举,为了进行测试,我想使其相等,但不知道这种模式如何适用于带有多个参数的枚举实例。

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道Swift 4.1可以为我们合成Equatable的一致性,但是目前我无法更新到该版本。

Mar*_*n R 18

一种方便的方法是使用元组可以与进行比较==。您还很多人希望将兼容性代码包含在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
}
Run Code Online (Sandbox Code Playgroud)

  • @PascaleBeaulac:“SSO”是否符合“Equatable”协议? (2认同)

Meh*_*dad 13

使用关联值的优雅方式(即使枚举是间接的):

首先你需要拥有以下value财产:

indirect enum MyEnum {
    var value: String? {
        return String(describing: self).components(separatedBy: "(").first
    }
    case greeting(text: String)
    case goodbye(bool: Bool)
    case hey
    case none
}

print(MyEnum.greeting(text: "Howdy").value)
// prints : greeting
Run Code Online (Sandbox Code Playgroud)

现在你可以使用像这样value实现:Equatable

indirect enum MyEnum: Equatable {
    static func == (lhs: MyEnum, rhs: MyEnum) -> Bool {
        lhs.value == rhs.value
    }
    
    var value: String? {
        return String(describing: self).components(separatedBy: "(").first
    }
    case greeting(text: String)
    case goodbye(bool: Bool)
    case hey
    case none
}
Run Code Online (Sandbox Code Playgroud)


ymu*_*tlu 5

您可以添加如下所示的内容,请查看此链接以获取更多信息。期权的退货声明取决于您的需求。

#if swift(>=4.1)
#else
func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
    switch (lhs, rhs) {
    case (let .heading(lhsString), let .heading(rhsString)):
        return lhsString == rhsString

    case (let .options(id1, title1, enabled1),let .options(id2, title2, enabled2)):
        return id1 == id2 && title1 == title2 && enabled1 == enabled2
    default:
        return false
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)

  • 需要是“静态函数” (2认同)