【问题标题】:How to create a predicate to filter array of enums with associated values in Swift?如何在 Swift 中创建一个谓词来过滤具有关联值的枚举数组?
【发布时间】:2015-09-07 13:02:00
【问题描述】:
enum EnumType {
    case WithString(String)
}

var enums = [EnumType]()

enums.append(EnumType.WithString("A"))
enums.append(EnumType.WithString("B"))
enums.append(EnumType.WithString("C"))
enums.append(EnumType.WithString("D"))
enums.append(EnumType.WithString("E"))
enums.append(EnumType.WithString("F"))

如何过滤我的enums 数组以找到关联值等于C 的数组。我需要使用什么谓词

【问题讨论】:

  • 没有枚举值的枚举的目的是什么?您只是在创建一个 String 元素的数组/列表。但是,过滤数组很容易: let filteredArray = array.filter { $0 匹配条件 }
  • 我将在一个更复杂的例子中使用它:-) 但本质是在最简单的例子中

标签: arrays swift filter enums


【解决方案1】:

过滤器函数既可以作为数组上的全局函数调用,也可以作为实例方法调用(我更喜欢后者,因为它更面向对象)。

它接受一个带有一个参数(被评估的元素)的闭包,该参数返回一个布尔值(指示元素是否符合要求的条件)。

由于它是在明确情况下的简单闭包,因此可以使用缩写形式。

我猜其他“With”案例会添加到您的枚举中,因此您可以使用以下内容:

let filteredArray = enums.filter { 
    switch $0 {
      case let .WithString(value):
        return value == "C"
      default:
        return false
    }
 }

这应该可以在您的示例中解决问题。

【讨论】:

  • 不,这不是诀窍......这不是rawValue的例子。
  • 如果不给我时间编辑答案,我认为不应该投反对票 ;-)
  • 致投反对票的用户:你能解释一下原因吗?不解释就投反对票是不礼貌的。我不太在乎声誉,但我确实在乎原因。
  • 谢谢。你拯救了我的一天。
【解决方案2】:

正如有人已经提到的,对于 Swift > 2.0,if case 语句可用:

enums.filter {
  if case .WithString("C") = $0 {
    return true
  }
  return false
}

但是,它看起来不太好,特别是如果您要再次重复相同的逻辑。我们在这里可以做的是使 EnumType 符合 Equatable:

extension EnumType: Equatable {
}

func ==(lhs: EnumType, rhs: EnumType) -> Bool {
    switch (lhs, rhs) {
    case (.WithString(let lStr), .WithString(let rStr)):
        return lStr == rStr
    }
}

现在你可以:

enums.filter { $0 == .WithString("C") }

【讨论】:

    【解决方案3】:

    您可以尝试在枚举中添加一个带有计算属性的简单扩展并过滤到该属性:

    extension EnumType {
      var isC: Bool {
        switch self {
        case .WithString(let message): return message == "C"
        default: return false
        }
      }
    }
    

    在此之后,您可以像往常一样简单地使用过滤器:

    enums.filter { $0.isC }
    

    【讨论】:

      【解决方案4】:
      var filteredArray = enums.filter { element in
          switch element {
          case EnumType.WithString(let string):
              return string == "A"
          default:
              return false
          }
      }
      

      这可以通过 Swift 2.0 绑定 if 语句中的关联值来简化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-31
        • 2020-12-10
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        相关资源
        最近更新 更多