【问题标题】:Value of type 'NSSet' has no member '_' - Unable to Access attributes through NSSet\'NSSet\' 类型的值没有成员 \'_\' - 无法通过 NSSet 访问属性
【发布时间】:2022-12-06 05:31:32
【问题描述】:

我有一个由 3 个实体设置的核心数据模型:Exercise、ExerciseSet 和 Workout。它的设置使 Exercise 和 ExerciseSet 具有一对一的关系,而 Workout 和 ExerciseSet 具有一对多的关系。我正在尝试通过 Workout 访问 ExerciseSet 中的属性,但是当我运行此代码时:

struct WorkoutView: View {
@State var workout = Workout()
    
    var body: some View {
        
        Text("Sets in Workout: \(workout.exerciseSets.count)")
        
        ForEach(Array(arrayLiteral: workout.exerciseSets), id: \.self) { e in
            Text("Exercise Name: \(e.exercise.exercisename), Reps: \(e.reps), Weight: \(e.weight)")         
        }

我收到以下错误

Value of type 'NSSet' has no member 'exercise'
Value of type 'NSSet' has no member 'reps'
Value of type 'NSSet' has no member 'weight'

当我在锻炼之外调用它们并且 workout.exerciseSets.count 按预期返回时,这些属性都存在。

以下是每个实体的定义:

extension Exercise {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Exercise> {
        return NSFetchRequest<Exercise>(entityName: "Exercise")
    }

    @NSManaged public var exercisename: String
    @NSManaged public var id: UUID?
    @NSManaged public var musclegroup: String?
    @NSManaged public var exerciseSet: ExerciseSet?

}

extension Exercise : Identifiable {

}
extension ExerciseSet {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<ExerciseSet> {
        return NSFetchRequest<ExerciseSet>(entityName: "ExerciseSet")
    }

    @NSManaged public var dateCompleted: Date
    @NSManaged public var id: UUID?
    @NSManaged public var reps: Int16
    @NSManaged public var weight: Int16
    @NSManaged public var exercise: Exercise
    @NSManaged public var workout: Workout?

}

extension ExerciseSet : Identifiable {

}

extension Workout {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Workout> {
        return NSFetchRequest<Workout>(entityName: "Workout")
    }

    @NSManaged public var id: UUID
    @NSManaged public var notes: String?
    @NSManaged public var workoutDate: Date
    @NSManaged public var workoutMuscleGroup: String?
    @NSManaged public var workoutName: String?
    @NSManaged public var exerciseSets: NSSet
    
    public var exerciseSetArray: [ExerciseSet] {
        let set = exerciseSets as? Set<ExerciseSet> ?? []
        return set.sorted {
            $0.dateCompleted < $1.dateCompleted
        }
        
    }

}

// MARK: Generated accessors for exerciseSets
extension Workout {

    @objc(addExerciseSetsObject:)
    @NSManaged public func addToExerciseSets(_ value: ExerciseSet)

    @objc(removeExerciseSetsObject:)
    @NSManaged public func removeFromExerciseSets(_ value: ExerciseSet)

    @objc(addExerciseSets:)
    @NSManaged public func addToExerciseSets(_ values: NSSet)

    @objc(removeExerciseSets:)
    @NSManaged public func removeFromExerciseSets(_ values: NSSet)

}

extension Workout : Identifiable {

}

为了能够通过 Workout 访问 ExerciseSet 中的属性,我是否缺少某些东西?谢谢你。

【问题讨论】:

    标签: xcode swiftui core-data nsset


    【解决方案1】:

    Swift 中的NSSet 不知道底层类型。

    Array(arrayLiteral: workout.exerciseSets) 替换为 workout.exerciseSetArray

    必须将 NSSet 转换为本机 Set&lt;ExerciseSet&gt; 才能访问属性。或者 - 更简单 - 将 exerciseSets 声明为 Set&lt;ExerciseSet&gt;。 Core Data 与原生 Swift 类型配合得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      相关资源
      最近更新 更多