我试图计算领域列表(包含在“WorkoutSessionObject”中)中的练习数,以填充tableview的正确行数,但由于某些原因,我无法计算出它不允许我访问属性?
它肯定是在检索WorkoutSessionObject,因为我试过打印它。
代码如下:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

//filter for a specific workout
    let predicate = NSPredicate(format: "workoutID = %@", workoutID)
    let workoutExercises = realm.objects(WorkoutSessionObject.self).filter(predicate)

//access the 'exercises' list and count it - this isn't working?
    let numberOfExercises = workoutExercises.exercises.count
    return numberOfExercises
}

我以类似的方式访问了这些属性来填充单元格,但显然我在那里使用index.row。
我得到的错误是
“Results”类型的值没有成员“exercises”
在代码中标记为不工作的行上
研究这里有一个答案Retrieve the List property count of realm for tableview Swift但这似乎不会返回作用域中的计数(它允许在示例中打印,但在我的代码中不起作用)
也就是说,我也试过这样做,但这不起作用,因为在作用域之外无法访问计数:
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let predicate = NSPredicate(format: "workoutID = %@", workoutID)

//the below works to count but then not accessible outside scope to define number of rows :-(

        let workoutExercises = realm.objects(WorkoutSessionObject.self).filter(predicate)
        for exercises in workoutExercises {
            let exerciseCount = exercises.exercises.count
            return exerciseCount
        }
//return exercise count for table rows - this doesn't work because not in scope
        return exerciseCount
    }

有什么想法吗?

最佳答案

问题是Realm的filter保留了原始类型(就像Swift的内置filter),因此workoutExercises的类型实际上是Results<WorkoutSessionObject>而不是单个WorkoutSessionObject
如果您知道workoutIDWorkoutSessionObject属性总是唯一的,那么您只需在first实例上调用Results

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let predicate = NSPredicate(format: "workoutID = %@", workoutID)
    let workoutExercises = realm.objects(WorkoutSessionObject.self).filter(predicate).first
    return workoutExercises?.exercises.count ?? 0
}

如果知道总会有匹配的WorkoutSessionObject,则可以强制展开workoutExercises
如果workoutID实际上是一个primaryKey,那么最好使用let workoutExercises = realm.object(ofType: WorkoutSessionObject.self, forPrimaryKey: workoutID)而不是筛选查询。

10-08 08:00