← All repositories

listless

A simple list app for Apple platforms

git clone https://code.inqk.net/listless.git


Listless/Models/ItemEntity.swift (1888B)

1import CoreData
2import Foundation
3
4@objc(TaskItem)
5public 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}