我有一个关联值的枚举,为了测试目的,我想使这些值相等,但是不知道这个模式将如何与多个参数的枚举情况一起工作。
例如,下面的总结我知道使标题相等的语法。对于包含不同类型的多个值的选项,这将如何工作?
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对我们来说可以综合一致,但是目前我还不能更新到这个版本。
发布于 2018-07-12 08:28:19
SE-0185合成可均衡化和可连接性的一致性已在SWIFT4.1中实现,因此它足以声明协议的一致性(如果所有成员都是Equatable):
enum ViewModel: Equatable {
case heading(String)
case options(id: String, title: String, enabled: Bool)
}对于早期的Swift版本,一个方便的方法是使用元组可以与==进行比较。
您还需要将兼容性代码包含在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
}发布于 2018-07-12 08:07:02
您可以添加如下内容,请查看此链接以获得更多信息。选项的返回语句取决于您的需要。
#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发布于 2021-04-26 03:49:02
使用关联值的优雅方法(即使枚举是间接的):
首先,您需要拥有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现在可以使用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
}https://stackoverflow.com/questions/51300121
复制相似问题