在 NSManagedObjectSubclass 上按 Swift Computed 属性 对 NSFetchedResultsController 进行排序

Sorting NSFetchedResultsController by Swift Computed Property on NSManagedObjectSubclass

我正在使用 Swift 和 Core Data 构建应用程序。在我的应用程序中的某个时刻,我想要 UITableView 显示持久存储中当前类型的所有对象。目前,我正在检索它们并使用 NSFetchedResultsController 在 table 视图中显示它们。我希望 table 视图按我的 NSManagedObject 子类的计算 属性 排序,如下所示:

class MHClub: NSManagedObject{
@NSManaged var name: String
@NSManaged var shots: NSSet
var averageDistance: Int{
    get{
        if shots.count > 0{
            var total = 0
            for shot in shots{
                total += (shot as! MHShot).distance.integerValue
            }
            return total / shots.count
        }
        else{
            return 0
        }
    }
}

在我的 table 视图控制器中,我设置 NSFetchedResultsControllerfetchRequest 如下:

let request = NSFetchRequest(entityName: "MHClub")
request.sortDescriptors = [NSSortDescriptor(key: "averageDistance", ascending: true), NSSortDescriptor(key: "name", ascending: true)]

这样设置会导致我的应用程序崩溃,并在日志中显示以下消息:

'NSInvalidArgumentException', reason: 'keypath averageDistance not found in entity <NSSQLEntity MHClub id=1>'

当我取出第一个排序描述符时,我的应用程序运行得很好,但我的 table 视图并没有完全按照我想要的方式排序。如何根据 Swift 中的 NSManagedObject 子类的计算 属性 对我的 table 视图进行排序?

正如 Martin 所指出的,您不能对计算的 属性 进行排序。每次击球时只需更新一个新存储的 属性 球杆。