2016-07-02 81 views
4

我在Swift 3中試驗CoreData,並且遇到了Xcode 8 beta中非常奇怪的循環編譯器錯誤。無法在Swift 3中實例化具有泛型類型AnyObject的NSFetchedResultController

NSFetchedResultsController需要一個泛型類型參數,並且AnyObject至今工作良好。編譯器會引發錯誤:

Type 'AnyObject' does not conform to protocol 'NSFetchRequestObject' 

Screen shot

爲了讓我加困惑,如果你刪除類型參數時,Xcode接着說:

Reference to generic type NSFetchedResultsController requires argument in `<...>` 

和有益建議使用<AnyObject>修復。 ...和循環重複。

這看起來非常像一個錯誤。我報告之前的任何想法?

+0

你想從DataProviderDelegate繼承這個類嗎? – Dershowitz123

+0

除非確實需要,否則絕不要在圖像中添加圖像。只需分享代碼。 –

回答

9

如果你看看NSFetchedResultsController,你可以清楚地看到它有一個名稱爲ResultType的參數,它符合NSFetchRequestResult。所以你應該通過符合NSFetchRequestResulttype

所以,如果你看看NSFetchRequestResult,你可以看到它符合NSObjectProtocol。另外NSDictionary,NSManagedObjectNSManagedObjectID符合NSFetchRequestResult

public protocol NSFetchRequestResult : NSObjectProtocol { 
} 

extension NSDictionary : NSFetchRequestResult { 
} 

extension NSManagedObject : NSFetchRequestResult { 
} 

extension NSManagedObjectID : NSFetchRequestResult { 
} 

那麼清楚,你應該通過從上述三種NSDictionaryNSManagedObjectNSManagedObjectIDtype

像這樣創建您的NSFetchedResultsController的實例。

let resultsController : NSFetchedResultsController<NSManagedObject>! 

或類似這樣的

let resultsController : NSFetchedResultsController<NSManagedObjectID>! 

或類似這樣的

let resultsController : NSFetchedResultsController<NSDictionary>! 
+0

你說的很對 - 我原來的(Swift 2)代碼沒有輸入parameterise NSFetchedResultController。類型參數是由一個自動化的Swift 3重構添加的,它似乎是一個需求,因爲試圖創建這個類而沒有類型參數被Xcode 8編譯器拒絕。我懷疑我的問題並不那麼清楚,儘管它沒有真正解決問題,但我仍然接受。任何其他想法? – rustproofFish

+2

用'''NSManagedObject''替換'''AnyObject'',這就是你所要做的。忘掉所有其他的東西。 –

0

在覈心數據模型映射在你的代碼生成的NSManagedObject的子類的任何實體,所以他們都可以使用要替換AnyObject,它們都會間接遵循NSFetchRequestResult協議。您應該看到哪個實體/類正在通過連接到此FetchedResultsController的FetchRequest獲取,這就是您應該在那裏使用的類型。