首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使具有关联值的Swift枚举等效

如何使具有关联值的Swift枚举等效
EN

Stack Overflow用户
提问于 2018-07-12 07:52:21
回答 4查看 32.7K关注 0票数 55

我有一个关联值的枚举,为了测试目的,我想使这些值相等,但是不知道这个模式将如何与多个参数的枚举情况一起工作。

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

代码语言:javascript
复制
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对我们来说可以综合一致,但是目前我还不能更新到这个版本。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-12 08:28:19

SE-0185合成可均衡化和可连接性的一致性已在SWIFT4.1中实现,因此它足以声明协议的一致性(如果所有成员都是Equatable):

代码语言:javascript
复制
enum ViewModel: Equatable {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
}

对于早期的Swift版本,一个方便的方法是使用元组可以与==进行比较。

您还需要将兼容性代码包含在Swift版本检查中,以便一旦项目更新为Swift 4.1,就可以使用自动合成:

代码语言:javascript
复制
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
}
票数 92
EN

Stack Overflow用户

发布于 2018-07-12 08:07:02

您可以添加如下内容,请查看此链接以获得更多信息。选项的返回语句取决于您的需要。

代码语言:javascript
复制
#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
票数 7
EN

Stack Overflow用户

发布于 2021-04-26 03:49:02

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

首先,您需要拥有value属性:

代码语言:javascript
复制
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

现在可以使用value来实现如下所示的Equatable

代码语言:javascript
复制
    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
   }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51300121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档