无法推断复杂的闭包返回类型;添加显式类型以消除歧义

Posted

技术标签:

【中文标题】无法推断复杂的闭包返回类型;添加显式类型以消除歧义【英文标题】:Unable to infer complex closure return type; add explicit type to disambiguate 【发布时间】:2018-05-02 08:08:36 【问题描述】:

有人知道如何解决我遇到的这个错误吗?在以下代码块的第一行收到错误:

let fetchedResultsController: NSFetchedResultsController = 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    return frc
()

【问题讨论】:

【参考方案1】:

尝试在闭包中添加返回类型,如下代码:

let fetchedResultsController: NSFetchedResultsController =  () -> NSFetchedResultsController<NSFetchRequestResult> in
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    return frc
()

【讨论】:

【参考方案2】:

错误信息有点误导,问题是你做了 不指定变量的通用占位符类型。

您可以向闭包添加显式返回类型,如@Mukesh 建议,在这种情况下,变量上的类型注释不是 需要:

let fetchedResultsController =  () -> NSFetchedResultsController<NSFetchRequestResult> in
    // ...
    return frc
()

或者完全指定变量的类型,然后闭包返回 自动推断类型:

let fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = 
    // ...
    return frc
()

【讨论】:

【参考方案3】:

两个问题:

    正如其他答案中提到的,您必须指定泛型类型,在您的情况下,理想的类型是具体的 NSManagedObject 子类。

    NSFetchedResultsController 的声明至少需要一个排序描述符

    let fetchedResultsController: NSFetchedResultsController<Message> = 
        let fetchRequest = NSFetchRequest<Message>(entityName: "Message")
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "somekey", ascending: true]
        let delegate = UIApplication.shared.delegate as! AppDelegate
        let context = delegate.persistentContainer.viewContext
        let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        return frc
    ()
    

【讨论】:

以上是关于无法推断复杂的闭包返回类型;添加显式类型以消除歧义的主要内容,如果未能解决你的问题,请参考以下文章

在 VStack 中包装 WebView 时出错:无法推断复杂的闭包返回类型;添加显式类型以消除歧义

SwiftUI ForEach“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”

无法使用 SwiftUI 推断复杂的闭包返回类型

Swift:选择器新视图

使用 PromiseKit 6 在 Swift 4.2 中缓存

SwiftUI ForEach-Loop 出现错误