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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:35:22