私のコードをSwift 3に移行していますが、100%確実ではないという問題がありました。NSFetchRequestResultに準拠したプロトコルを拡張する
コアデータチームは、フレームワークをジェネリックにフレンドリーに更新し、NSFetchRequest
は、NSFetchRequestResult
に準拠するオブジェクトを返すようになりました。 I以下のコードではそう
言っ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)
私は、これは二項演算子とは何かを持っているとは思わないので...私はそれが私スウィフトバグであることをあまりにも簡単に結論にジャンプする前に、それは少し混乱していますもしも今も同様の問題に遭遇しました。
私はこの使用してジェネリック医薬品を回避することができる午前:
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