这是我的一些枚举:
enum SlideTemplate : Equatable {
case centered(content: SlideContent)
case horizontalSplit(leftContent: SlideContent, rightContent: SlideContent)
case empty
static func == (lhs: SlideTemplate, rhs: SlideTemplate) -> Bool {
// not sure what to do here
}
}
enum SlideContent {
case text(content: String)
case image(content: UIImage)
}
struct Slide {
let template: SlideTemplate
}
现在我想检查幻灯片有什么类型的模板。
func getSlideTemplate(slide: Slide) {
if slide.template == SlideTemplate.centered {
print("centered")
} else if slide.template == SlideTemplate.horizontalSplit {
print("horizontalSplit")
} else {
print("empty")
}
}
上面的功能显然不行。它指出:
"Binary operator '==' cannot be applied to operands of type 'SlideTemplate' and '(SlideContent, SlideContent) -> SlideTemplate'"
我不确定如何解决这个问题。我查找了比较枚举的其他案例,但我无法将它们应用于这种情况。
最佳答案
主要思想是比较相关值和那些 raw
值(如果需要)。所以,你的 ==
func 可以是这样的:
static func == (lhs: SlideTemplate, rhs: SlideTemplate) -> Bool {
switch (lhs, rhs) {
case let (.centered(lvalue), .centered(rvalue)):
return lvalue == rvalue
case let (.horizontalSplit(lleft, lright), .horizontalSplit(rleft, rright)):
return lleft == rleft && lright == rright
case (.empty, .empty):
return true
default:
return false
}
}
例如,如果您不需要比较 .centered
的 raw
值,则可以只检查相关值:
...
case (.centered, .centered):
return true
...
正如@user28434 提到的,您应该使 SlideContent
也符合 Equatable
协议(protocol)。
static func ==(lhs: SlideContent, rhs: SlideContent) -> Bool {
switch (lhs, rhs) {
case let (.text(lcontent), .text(rcontent)):
return lcontent == rcontent
case let (.image(lcontent), .image(rcontent)):
return lcontent == rcontent
default:
return false
}
}
现在您可以通过 ==
完整类型值进行比较,例如:
if slide.template == SlideTemplate.centered(content: SlideContent.text(content: "SomeContent")) {
print("centered for SomeContent")
}
要快速比较关联值,您可以使用 if case
结构:
if case .centered = slide.template {
print("centered")
}
结论。
- 如果您想知道“什么类型的
SlideTemplate
包含此属性”- 使用if case .centered = slide.template { ... }
方式而不实现Equatable
协议(protocol)。 - 如果您想完全比较
SlideTemplate
属性 - 实现Equatable
协议(protocol)并将它们与==
进行比较。
关于ios - 比较枚举和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168241/