Я переношу свой код на Swift 3, и я столкнулся с проблемой, о которой я не уверен на 100%.Расширение протоколов, соответствующих NSFetchRequestResult
Начиная с WWDC 2016 команда Core Data обновила свою фреймворк, чтобы быть более дружественной к дженерикам, а новая усиленная до NSFetchRequest
теперь возвращает объекты, соответствующие NSFetchRequestResult
.
Так в коде ниже у меня есть базовый протокол, который соответствует указанному NSFetchRequestResult
протокола, а также в расширении своего ребенка протокола ManagedObjectFetchable
Я хочу вернуть выборки объектов соответствующих типов:
import CoreData
@objc protocol ManagedObjectType: class, NSFetchRequestResult { }
protocol ManagedObjectFetchable: ManagedObjectType { }
extension ManagedObjectFetchable {
static func preFetch(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [Self] {
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
return try dummyContext.fetch(fetchRequest)
}
}
Проблема вот эта строка:
// Error: Binary operator '<' cannot be applied to operands of type 'NSFetchRequest<_>.Type' and 'Self.Type'
let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName)
это немного сбивает с толку, потому что я не думаю, что это не имеет ничего общего с бинарными операторами ... Перед тем, как перейти к слишком простой вывод, что это ошибка Swift I было интересно, yone столкнулся с аналогичными проблемами.
Я могу обойти эту проблему с помощью дженериков:
extension ManagedObjectFetchable {
static func preFetch<T: ManagedObjectFetchable>(for predicate: Predicate, sortedBy sortDescriptors: [SortDescriptor]) throws -> [T] {
let fetchRequest = NSFetchRequest<T>(entityName: Self.entityName)
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDescriptors
let dummyContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
return try dummyContext.fetch(fetchRequest)
}
}
Это то, что я собираюсь с сейчас, но мне не нравится, не понимая, почему это не будет работать. Если бы кто-нибудь мог помочь просветить эту проблему, это было бы потрясающе!
Фантастический! Спасибо, Джек, я не думал об этом обходном пути. Я подал для этого радар: https://openradar.appspot.com/radar?id=6083573912174592 – Jad