0
class MyClass: Decodable {

    let title: String?
    let type: MyClass.MyType?

    enum MyType {
        case article(data: [Article])
        case link(data: [LinkTile])
        case none
    }
}

我想过滤一个MyClass项目数组,所以过滤后的数组不会包含类型为的实例.none

let filteredArray = array.filter { $0.type != .none } // this doesn't work
4

2 回答 2

2

不幸的是,您不能将==withenum与关联值一起使用。您需要使用模式匹配,但这需要在switchorif语句中完成。

所以,这会导致像这样丑陋的事情:

let filteredArray = array.filter { if case .none = $0.type! { return false }; return true }

笔记:

  1. 你不能命名你的enum Type,因为它与内置的Type. 将其更改为类似MyType.

  2. none在 custom 中用作 case非常令人困惑,enum因为它(被人类)与optionalnone混淆了。更糟糕的是,您的属性是可选的。在这里我用力解开了它,但这当然是危险的。type

    你可以这样做:

    if case .none? = $0.type
    

    这将none明确匹配大小写并nil视为您要保留的内容。

    要过滤掉niland .none,您可以使用nil 合并运算符 ??

    if case .none = ($0.type ?? .none)
    

    我建议声明typeasMyClass.MyType而不是MyClass.MyType?.

于 2019-07-11T12:14:03.817 回答
0

我给你做了一个简单的例子,说明如何在你的上下文中使用 enum 和过滤器函数。

enum Foo {

  case article(data: [Int])
  case link(data: [String])
  case `none`

  static func myfilter(array: [Foo]) -> [Foo]{
    var newArray:[Foo] = []
    for element in array {
      switch element {
      case .article(let article):
        newArray.append(.article(data: article))
      case .link(let link):
        newArray.append(.link(data: link))
      case .none:
        break
      }
    }
    return newArray
  }
}

let foo: [Foo] = [.article(data: [1,2,3]), .link(data: ["hello", "world"]), .none]

print(Foo.myfilter(array: foo))

我制作了一个可以编译和测试的代码,你必须更改Foo,articlelink.

当你想使用枚举时,你必须使用switch case.

如果你绝对想在 swift 中使用过滤器,你可以,但你需要实现协议序列,在这种情况下更复杂。

对于枚举的每个案例,您必须管理一个使用模式匹配概念的案例。它非常强大。

于 2019-07-11T13:00:51.437 回答