2
我正在將我的代碼遷移到Swift 3,並遇到了一個我並非100%確定的問題。擴展符合NSFetchRequestResult的協議
從WWDC 2016開始,核心數據團隊更新了他們的框架,以便對泛型更友好,並且新增了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)
,因爲我不認爲這有什麼用二元運算符這是一個有點混亂......在我跳到太容易的結論,這是一個錯誤斯威夫特我想知道是否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