SwiftUI中如何按值引用数组索引并返回所有匹配项?
解决方案
你的辅助函数逻辑本身是正确的,filter会返回所有符合条件的元素,只返回单个结果大概率是以下原因:
equipments数组中不存在同时包含"Barbell"和"Dumbbell"的元素(比如拼写错误、大小写不一致)- 函数调用或数组定义存在其他隐性问题
以下是更可靠的实现方式,同时支持按名称批量获取MuscleGroup和Equipment:
1. 给数组添加扩展(更简洁易用)
为[MuscleGroup]和[Equipment]添加扩展方法,直接通过名称数组获取匹配元素:
// 补充完整结构体定义示例 struct Equipment: Identifiable { var id = UUID() var name: String // 其他属性... } struct MuscleGroup: Identifiable { var id = UUID() var name: String // 其他属性... } // Equipment数组扩展:按名称筛选 extension Array where Element == Equipment { func byNames(_ names: [String], caseSensitive: Bool = true) -> [Equipment] { filter { equipment in if caseSensitive { return names.contains(equipment.name) } else { return names.contains { $0.lowercased() == equipment.name.lowercased() } } } } } // MuscleGroup数组扩展:按名称筛选 extension Array where Element == MuscleGroup { func byNames(_ names: [String], caseSensitive: Bool = true) -> [MuscleGroup] { filter { muscleGroup in if caseSensitive { return names.contains(muscleGroup.name) } else { return names.contains { $0.lowercased() == muscleGroup.name.lowercased() } } } } }
2. 验证数据源
先确认equipments和muscleGroups数组中确实包含目标元素,比如:
let equipments: [Equipment] = [ Equipment(name: "Barbell"), Equipment(name: "Dumbbell"), Equipment(name: "Ab Wheel") ] let muscleGroups: [MuscleGroup] = [ MuscleGroup(name: "Core"), MuscleGroup(name: "Shoulders") ]
3. 按名称创建Exercise实例
现在可以直接通过名称数组获取对应的元素数组:
let exercises = [ Exercise( name: "Ab Wheel", muscleGroup: muscleGroups.byNames(["Core", "Shoulders"]), equipment: equipments.byNames(["Barbell", "Dumbbell"]) ) ]
排查要点
- 检查
equipments和muscleGroups中的元素名称是否与传入的字符串完全一致(包括大小写),如果需要忽略大小写,调用时传caseSensitive: false即可 - 打印
equipments.byNames(["Barbell", "Dumbbell"])的结果,确认返回的数组元素数量是否符合预期
内容的提问来源于stack exchange,提问作者SLAC
相关产品推荐
相关产品推荐

