NSFetchedResultsController 不适用于 sectionNameKeyPath 的瞬态 属性

NSFetchedResultsController not working with transient property for sectionNameKeyPath

在 Swift 3 和 Xcode8.3

中工作正常

我正在进行一个项目,其中包含用于保存消息的核心数据。
它根据时间对邮件进行排序,并根据日期对其进行分段。

方法如下:

let request = NSFetchRequest(entityName: "Message")
let sortDiscriptor = NSSortDescriptor(key: "time", ascending: true)
request.sortDescriptors = [sortDiscriptor]

fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainThreadMOC, sectionNameKeyPath: "sectionTitle", cacheName: nil)
fetchedResultsController.delegate = self
do {
    try fetchedResultsController.performFetch()
} catch {
    fatalError("Failed to initialize FetchedResultsController: \(error)")
}

这里是短暂的属性:

var sectionTitle: String? {
    //this is **transient** property
    //to set it as transient, check mark the box with same name in data model
    return time!.getTimeStrWithDayPrecision()
}

用作:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  let sectionInfo = fetchedResultsController.sections![section]
  let n =  sectionInfo.numberOfObjects
  return n
}

它总是给出 0 个部分并且 sectionTitle 属性 永远不会被调用。

此设置 was/is 与 Xcode8.3.
中的 Swift3 一起正常工作 即使这在 Xcode9-beta.
中也适用于 Swift3.2 但是如果我在 Xcode9-beta 中切换到 Swift4,它就不起作用了。

我刚刚将构建设置中的 'Swift 3 @objc inference' 切换为 'on',一切正常。

将@objc 添加到瞬态 属性,因此:

@objc var sectionTitle: String? {
    //this is **transient** property
    //to set it as transient, check mark the box with same name in data model
    return time!.getTimeStrWithDayPrecision()
}