Как использовать «Self.attr» в KeyPath? - PullRequest
2 голосов
/ 18 января 2020

Я пытаюсь использовать «Self.displayOrder» в расширении протокола, но возникает следующая ошибка «Поток 1: неустранимая ошибка: не удалось извлечь строку из KeyPath Swift.ReferenceWritableKeyPath»

Вот код


protocol Listable where Self: NSManagedObject {
    static func sortedFetchRequest() -> NSFetchRequest<Self>
    var displayOrder: Int { get set }

}

extension Listable {
    static func sortedFetchRequest() -> NSFetchRequest<Self> {
        let req: NSFetchRequest<Self> = NSFetchRequest(entityName: String(describing: Self.self))
        req.sortDescriptors = [NSSortDescriptor(keyPath: \Self.displayOrder, ascending: true)]
        return req
    }
}

final class OwnerModel: NSManagedObject, Identifiable, Listable {
    @NSManaged var displayOrder: Int
}

1 Ответ

1 голос
/ 18 января 2020

Вам необходимо объявить протокол с помощью @objc:

@objc protocol Listable where Self: NSManagedObject {
    var displayOrder: Int { get set }
}

. Это скажет компилятору использовать среду выполнения Objective- C при обработке пути к ключу и разрешит преобразование из Swift. KeyPath в строку, необходимую для SortDescriptor.

Одно примечание, sortedFetchRequest пришлось удалить из определения протокола, поскольку реализации по умолчанию для требований протокола в протоколе невозможны: @ onj c, поскольку реализация по умолчанию отправляется статически, а протокол @ obj c отправляется динамически. Это не мешает вам использовать реализацию по умолчанию в коде Swift.

...