2016-09-22 119 views
2

我創建了一個輔助函數來使用支持iOS 9.0+的Swift 3加載NSManagedObject無法使用類型爲'(NSFetchRequest <NSFetchRequestResult>)'的參數列表調用'fetch'

class func loadContext(entityName: String, fetchConfiguration: ((NSFetchRequest<NSManagedObject>) -> Void)?) -> AnyObject? { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    // Fetch requested data 
    let dataFetchRequest = NSFetchRequest<NSManagedObject>(entityName: entityName) 

    // Configure the fetch request with user parameters 
    if fetchConfiguration != nil { 
     fetchConfiguration!(dataFetchRequest) 
    } 

    do { 
     return try appDelegate.managedObjectContext.fetch(dataFetchRequest as! NSFetchRequest<NSFetchRequestResult>) 
    } catch { 
     print("Failed to fetch feed data, critical error: \(error)") 
    } 

    return nil 
} 

不過,我得到以下錯誤:

Cannot invoke 'fetch' with an argument list of type '(NSFetchRequest<NSFetchRequestResult>)'

我自己也嘗試幾個變種,如具有let dataFetchRequest = NSFetchRequest<NSFechRequestResult>(entityName: entityName),他們都遇到了同樣的錯誤。

+0

我遇到了完全相同的問題。你有沒有找到解決方案? Swift 3中不允許泛型調用? – dmorrow

回答

1

的變化是簡單了很多,卻彷彿Xcode中錯誤地推斷將代碼從swift-2轉換爲3.0時的「AnyObject」類型。

僅供參考,這是來自@ dmorrow解決方案的固定功能。

class func loadContext(entityName: String, fetchConfiguration: ((NSFetchRequest<NSManagedObject>) -> Void)?) -> [NSManagedObject]? { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    // Fetch requested data 
    let dataFetchRequest = NSFetchRequest<NSManagedObject>(entityName: entityName) 

    // Configure the fetch request with user parameters 
    fetchConfiguration?(dataFetchRequest) 

    do { 
     return try appDelegate.managedObjectContext.fetch(dataFetchRequest) 
    } catch { 
     print("Failed to fetch feed data, critical error: \(error)") 
    } 

    return nil 
} 
3

這已在我的問題Swift 3/XCode 8 NSManagedObjectContext.fetch error上得到解答。

XCode提供的錯誤消息不正確。正確的解決方法是正確投射你的回報和你的方法。

managedObjectContext.fetch()返回[Any]。有三個你需要做的改變。

  1. class func loadContext(entityName: String, fetchConfiguration: ((NSFetchRequest<NSManagedObject>) -> Void)?) -> [NSManagedObject]? {
  2. let dataFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
  3. return try appDelegate.managedObjectContext.fetch(dataFetchRequest) as? [NSManagedObject]

我已經提交bug報告給蘋果 - https://openradar.appspot.com/radar?id=5049582866137088

相關問題