2016-07-30 9 views
2

私のコードを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) 
    } 
} 

は、これは私が今のと一緒に行くのですが、私は、これは動作しないだろう、なぜ理解していない好きではないものです。もし誰かがこの問題を啓発するのを助けることができたらそれはすばらしいでしょう!

答えて

1

これはSwiftのバグです。変更:へ

let fetchRequest = NSFetchRequest<Self>(entityName: Self.entityName) 

let fetchRequest: NSFetchRequest<Self> = NSFetchRequest(entityName: Self.entityName) 

、コードはコンパイルする必要があります。

+1

素晴らしい!ありがとうジャック、私はその回避策を試みるとは思わなかった。私はこのためにレーダーを提出しました:https://openradar.appspot.com/radar?id=6083573912174592 – Jad

関連する問題