2016-09-22 118 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

相关问题