Core Data中无法通过NSSet访问ExerciseSet属性的问题排查
问题原因与解决方案
错误根源
你遇到的问题核心在于Workout的exerciseSets属性是NSSet类型——这是Objective-C的无类型集合,Swift无法自动推断集合内元素的具体类型,所以遍历的时候e会被识别为Any类型,自然找不到ExerciseSet的exercise、reps、weight这些属性。
而你其实已经在Workout扩展里写好了正确的解决方案:exerciseSetArray计算属性,它把NSSet转成了强类型的[ExerciseSet]数组,还做了排序,只是没在视图里用上它。
修复后的代码
把WorkoutView里的遍历逻辑替换为使用exerciseSetArray即可:
struct WorkoutView: View { @State var workout = Workout() var body: some View { Text("Sets in Workout: \(workout.exerciseSetArray.count)") ForEach(workout.exerciseSetArray) { e in Text("Exercise Name: \(e.exercise.exercisename), Reps: \(e.reps), Weight: \(e.weight)") } } }
额外说明
- 为什么
workout.exerciseSets.count能正常运行?
因为NSSet本身自带count属性,不需要识别元素类型就能调用。 - 如果不想用计算属性,也可以手动强转集合类型,但代码会更繁琐:
显然ForEach(Array(workout.exerciseSets as? Set<ExerciseSet> ?? []), id: \.self) { e in // 后续属性访问逻辑 }exerciseSetArray的写法更简洁易读,还自带排序逻辑,推荐优先使用。
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

