ios - 比较枚举和参数

标签 ios swift enums

这是我的一些枚举:

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
    }
}

例如,如果您不需要比较 .centeredraw 值,则可以只检查相关值:

...
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/

相关文章:

iphone - 架构 i386 的 undefined symbol - 在制作 UIButton 子类时

ios - 一段时间后用户默认值更改为以前的值 - Swift

swift - 为什么我不能在 .onError() 之后保持 observable 存活,即使我已经使用了像 .catchError() onRxSwift 这样的错误处理?

enums - 我可以用它的数值设置一个枚举吗?

ios - 什么是 pancake.apple.com?

ios - 如何在 UICollectionView 中查找与特定单元格水平和垂直相邻的单元格/索引路径

ios - URL矩阵参数和IOS

objective-c - 未知类名 PKPaymentAuthorizationViewControllerDelegate

ruby-on-rails - Rails 枚举验证不起作用但引发 ArgumentError

c# - 为什么即使在枚举中没有定义有效值时也允许枚举转换