无法使用类型为“(NSFetchRequest<NSFetchRequestResult>)”的参数列表调用“获取”

Posted

技术标签:

【中文标题】无法使用类型为“(NSFetchRequest<NSFetchRequestResult>)”的参数列表调用“获取”【英文标题】:Cannot invoke 'fetch' with an argument list of type '(NSFetchRequest<NSFetchRequestResult>)' 【发布时间】:2016-09-22 22:56:19 【问题描述】:

我创建了一个辅助函数来使用支持 ios 9.0+ 的 Swift 3 加载 NSManagedObjects。

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&lt;NSFetchRequestResult&gt;)'

我也尝试了几种变体,例如let dataFetchRequest = NSFetchRequest&lt;NSFechRequestResult&gt;(entityName: entityName),它们都遇到了相同的错误。

【问题讨论】:

我遇到了完全相同的问题。你有没有找到解决办法? Swift 3 中不允许通用调用吗? 【参考方案1】:

我的问题Swift 3/XCode 8 NSManagedObjectContext.fetch error已经回答了这个问题。

XCode 提供的错误消息不正确。正确的解决方法是正确地投射你的回报和你的方法。

managedObjectContext.fetch() 返回[Any]。您需要进行三项更改。

    class func loadContext(entityName: String, fetchConfiguration: ((NSFetchRequest&lt;NSManagedObject&gt;) -&gt; Void)?) -&gt; [NSManagedObject]? let dataFetchRequest = NSFetchRequest&lt;NSFetchRequestResult&gt;(entityName: entityName) return try appDelegate.managedObjectContext.fetch(dataFetchRequest) as? [NSManagedObject]

我已向 Apple 提交错误报告 - https://openradar.appspot.com/radar?id=5049582866137088

【讨论】:

【参考方案2】:

更改要简单得多,似乎 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

【讨论】:

以上是关于无法使用类型为“(NSFetchRequest<NSFetchRequestResult>)”的参数列表调用“获取”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

无法使用类型为“”的参数列表调用类型“”的初始化程序

无法使用类型为 '(Codable.Type?

Constraint 无法解析为类型

无法使用类型为“(UInt32)”的参数列表调用类型“CGBitmapInfo”的初始化程序

无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标