为啥我不能使用闭包创建 Fetched Results Controller?

Posted

技术标签:

【中文标题】为啥我不能使用闭包创建 Fetched Results Controller?【英文标题】:Why can't I create a Fetched Results Controller using a closure?为什么我不能使用闭包创建 Fetched Results Controller? 【发布时间】:2017-05-25 13:33:13 【问题描述】:

我正在尝试按照一些教程创建一个 Fetched Results Controller。但是,在 Swift 3 中,当尝试按照您在下面看到的模式中创建闭包类型时,出现错误“无法推断复杂闭包类型”。

class FriendsController: UICollectionViewController 

lazy var fetchedResultsController: NSFetchedResultsController = 
    let context = (UIApplication.shared.delegate as! 
AppDelegate).persistentContainer.viewContext

    let fetchRequest: NSFetchRequest = Friend.fetchRequest()

    let fetchedResultsController = 
NSFetchedResultsController(fetchRequest: fetchRequest, 
managedObjectContext: context, sectionNameKeyPath: nil, cacheName: 
nil)
    return fetchedResultsController
()

我在制作视图、按钮等其他东西时使用这种闭包模式,但是它不起作用(即使我不使用惰性变量)。这个错误对我来说也不是很清楚(如上所述)。谢谢。

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 在 Swift 3 中是通用的。您必须指定具体类型,因为编译器无法推断复杂的闭包类型

lazy var fetchedResultsController: NSFetchedResultsController<Friend> =  ...

【讨论】:

谢谢瓦迪安。这是有道理的,因为教程是在 Swift 2x 中,只有我在 Swift 3 中遇到错误。我很高兴我现在在上面的代码中包含了 fetchRequest!【参考方案2】:

因为您应该指定 FetchedResultsControllers 持有的对象的通用类型

lazy var fetchedResultsController: NSFetchedResultsController<Friend> = 

    let context = //your context

    let req = // your request

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext:context, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController.delegate = self

    do 
        try fetchedResultsController.performFetch()

    
    catch 
        print("fetch error \(error)")
    
    return fetchedResultsController
()

【讨论】:

非常感谢亚历克斯。现在说得通了!

以上是关于为啥我不能使用闭包创建 Fetched Results Controller?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rust 不能为传递给过滤器的闭包推断正确的类型?

为啥这个闭包不能访问 'this' 关键字? - jQuery

为啥 coffescript 创建这个闭包 [重复]

为啥不对对象属性使用闭包?

使用 fetched 属性的核心数据跨存储查询

为啥 Swift 闭包不捕获自我?