2016-07-30 129 views
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) 
    } 
} 

這就是我跟去了,但現在我不喜歡不理解爲什麼這是行不通的。如果有人能幫助啓發這個很棒的問題!

回答

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