swift - 通过具有关联值的枚举属性过滤项目数组

标签 swift filter enums associated-value

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

最佳答案

很遗憾,您不能使用 ==enum具有相关值的 s。您需要使用模式匹配,但这需要在 switch 中完成或 if声明。

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

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

注意事项:

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

  2. 使用 none 非常困惑作为定制案例 enum因为它(被人类)混淆了 none在一个可选中。你的 type 使情况变得更糟属性是可选的。在这里,我用力打开了它,但这当然很危险。

    你可以这样做:

    if case .none? = $0.type
    

    这将匹配 none明确案例并对待nil作为你想要保留的东西。

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

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

    我建议声明 type作为MyClass.MyType而不是 MyClass.MyType? .

关于swift - 通过具有关联值的枚举属性过滤项目数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56988742/

相关文章:

swift - 位置管理器位置

ios - iPad 屏幕向后倾斜一定角度时出现错误 View

ios - NSNotification 用户信息在按下按钮时保持堆叠

swift - 从数据源方法中使用的完成 block /闭包返回值

javascript - 过滤函数返回未定义

c# - 在 C# winforms 应用程序中使用文本框过滤 Treeview

javascript - 根据多个值或参数过滤 JSON 对象数组

python - 禁止使用 python 类型将枚举条目作为函数参数的值

java - 为什么 compareTo 在 Java 中的 Enum final 上?

c# - 我总是必须使用枚举还是我做错了什么?