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})存在两个核心问题:
ItemType.sword不是完整的枚举实例——.sword是带关联值的case,必须传入具体的Swords值(比如.sword(.Sabre))才能形成可比较的实例。- 即便你写了完整实例(比如
$0 == .sword(.Sabre)),它也只会匹配某一种特定的剑,而非所有.sword类型的元素。
是否需要重构枚举结构?
不需要。当前的嵌套枚举设计逻辑清晰:用ItemType统一管理装备类型,通过关联值携带具体子枚举,完全符合Swift枚举的最佳实践,仅通过模式匹配就能实现需求,无需修改现有结构。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

