ios - 在 Swift 4 中从计算变量创建关键路径

标签 ios swift core-data nsfetchedresultscontroller

我有一个 fetchedResultsController ,我想在其中添加 Date 的键路径,这样我就没有一天中每一秒的部分。足够简单,我想...我将为 MyEntity

创建一个 扩展
extension MyEntity {

  var dateForSection: String {
    get {
      let dateFormatter = DateFormatter()
      dateFormatter.dateStyle = .long
      if let time = self.time {
        return dateFormatter.string(from: time)
      }
      return "Unavailable Date"
    }
  }
}

然后,在 fetchedResultsController 惰性 var 声明中的 MyViewController 上,我声明 frc 如下:

let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: #keyPath(MyEntity.dateForSection), cacheName: nil)

我收到此编译器错误:

Argument of '#keyPath' refers to non-'@objc' property 'dateForSection'

在谷歌搜索中,这个问题看到了 2016 年的一些 Swift 错误报告,但我还没有看到任何解决方案。我该如何解决这个问题?

附录

我尝试在 var 声明前面添加 @objc 。我还尝试过添加@objc动态、关闭Xcode、从命令行删除派生数据、重新启动Xcode、重新启动我的机器等。

最佳答案

我无法重现该问题。我创建了一个核心数据项目,其中包含从我的实体自动生成的 Group 类,并添加了一个计算变量:

extension Group {
    @objc var yoho : String {
        return "yoho"
    }
}

然后我修改了我的延迟获取结果 Controller 初始值设定项中的同一行:

    let frc = NSFetchedResultsController(
        fetchRequest:req,
        managedObjectContext:self.managedObjectContext,
        sectionNameKeyPath:#keyPath(Group.yoho), cacheName:nil)

它可以编译。我不知道为什么你的没有。

另一方面,#keyPath只不过是为您生成的一个字符串,而这里期望的是一个字符串,所以如果您确实无法编译它,只需输入 “dateForSection” 并完成它。当然,这并不意味着它会运行而不会崩溃,但至少它会编译并且您可以继续。

关于ios - 在 Swift 4 中从计算变量创建关键路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586057/

相关文章:

ios - Lion 上的 Xcode 4.2——应用商店认为该应用已安装

c# - Monotouch 对话框多行元素高度不增长

Swift/SpriteKit 许多对象之间的碰撞检测

ios - 在易出错的初始值设定项 swift 1.2 中分配 let 变量

ios - 需要从每个名称的倍数的数组中获取名称列表(每个名称只有 1 个实例)

ios - 如何使用Objective C从iOS的核心数据中过滤数据

ios - IAP 是否总是在相同的有序列表中返回?

ios - 如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?

ios - 从 View 中删除 UIView

objective-c - 创建 NSManagedObject(大尺寸)。内存警告和应用程序崩溃