ItemEntity.swift (1888B)
1 import CoreData 2 import Foundation 3 4 @objc(TaskItem) 5 public class ItemEntity: NSManagedObject, Identifiable { 6 private static let invalidatedID = UUID(uuidString: "00000000-0000-0000-0000-000000000000")! 7 8 private enum Keys { 9 private static func key<Value>(_ keyPath: KeyPath<ItemEntity, Value>) -> String { 10 NSExpression(forKeyPath: keyPath).keyPath 11 } 12 13 static let id = "id" 14 static let title = key(\ItemEntity.title) 15 static let createdAt = key(\ItemEntity.createdAt) 16 static let updatedAt = key(\ItemEntity.updatedAt) 17 static let sortOrder = key(\ItemEntity.sortOrder) 18 static let completedOrder = key(\ItemEntity.completedOrder) 19 } 20 21 public var id: UUID { 22 (primitiveValue(forKey: Keys.id) as? UUID) ?? Self.invalidatedID 23 } 24 25 @NSManaged public var title: String 26 @NSManaged public var createdAt: Date 27 @NSManaged public var updatedAt: Date 28 @NSManaged public var sortOrder: Int64 29 @NSManaged public var completedOrder: Int64 30 31 public var isCompleted: Bool { completedOrder > 0 } 32 33 @nonobjc public class func fetchRequest() -> NSFetchRequest<ItemEntity> { 34 return NSFetchRequest<ItemEntity>(entityName: "TaskItem") 35 } 36 37 public override func awakeFromInsert() { 38 super.awakeFromInsert() 39 setPrimitiveValue(UUID(), forKey: Keys.id) 40 setPrimitiveValue(Date(), forKey: Keys.createdAt) 41 setPrimitiveValue(Date(), forKey: Keys.updatedAt) 42 setPrimitiveValue("", forKey: Keys.title) 43 setPrimitiveValue(0, forKey: Keys.sortOrder) 44 setPrimitiveValue(0, forKey: Keys.completedOrder) 45 } 46 47 public override func willSave() { 48 super.willSave() 49 if !isDeleted && changedValues().keys.contains(where: { $0 != Keys.updatedAt }) { 50 setPrimitiveValue(Date(), forKey: Keys.updatedAt) 51 } 52 } 53 }