You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift数组中如何提取嵌套枚举ItemType下的所有sword元素

如何从嵌套枚举数组中提取所有ItemType.sword类型元素?

提取所有.sword类型的ItemType元素

要过滤数组中所有ItemType.sword类型的元素,你可以利用Swift的模式匹配来判断枚举case,而非直接用==比较。

最简单的写法是用filter结合模式匹配:

let allSwordItems: [ItemType] = loots.filter { case .sword = $0 }

如果你需要提取sword关联的具体Swords枚举值(而非ItemType实例),可以用compactMap:

let swordValues: [Swords] = loots.compactMap {
    if case let .sword(sword) = $0 {
        return sword
    }
    return nil
}

为什么你的原代码无法生效?

你之前写的loots.first(where: {$0 == ItemType.sword})存在两个核心问题:

  1. ItemType.sword不是完整的枚举实例——.sword是带关联值的case,必须传入具体的Swords值(比如.sword(.Sabre))才能形成可比较的实例。
  2. 即便你写了完整实例(比如$0 == .sword(.Sabre)),它也只会匹配某一种特定的剑,而非所有.sword类型的元素。

是否需要重构枚举结构?

不需要。当前的嵌套枚举设计逻辑清晰:用ItemType统一管理装备类型,通过关联值携带具体子枚举,完全符合Swift枚举的最佳实践,仅通过模式匹配就能实现需求,无需修改现有结构。

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:46:05