我试图计算领域列表(包含在“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
。
如果您知道workoutID
的WorkoutSessionObject
属性总是唯一的,那么您只需在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)
而不是筛选查询。