#概要
テーブルを使って、タイムスタンプを持っているデータを日付ごとにセクションわけして表示する方法は、いろいろなところで紹介れています。
例えば具体的な方法は
[Swift,iOS,CoreData]NSFetchedResultsControllerでテーブルの日付別セクション分け
を参照してください。
これまでこの方法で正しく動作していましたが、Swift4にマイグレーションさせた後、セクションに表示する日付が取れなくなりました。
いろいろ調べた結果、Transient に設定した Attribute に対応するモデルクラスのプロパティに @objc を付加する必要がありました。
Swift3 から Swift4 への自動マイグレーションで @objc は、付加されませんでした。
#具体的な変更箇所
Transient に設定した Attribute の名前が sectionIdentifier であるとき、そのモデルクラスのプロパティの先頭に @objc を付加する。
(以下のコードの内容は、概要欄で紹介したリンク先と基本的に同じです。)
@objc var sectionIdentifier: String {
get {
self.willAccessValue(forKey: "sectionIdentifier")
var tmp = self.primitiveValue(forKey: "sectionIdentifier") as? String
self.didAccessValue(forKey: "sectionIdentifier")
if tmp == nil {
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day], from: self.completion_date as Date)
tmp = String(format: "%ld", components.year! * 10000 + components.month! * 100 + components.day!)
self.setPrimitiveValue(tmp, forKey: "sectionIdentifier")
}
return tmp!
}
}
(Xcode9.1 Swift4.0 使用)