Section 5/181 menit

5. App Entities: Domain Objects untuk Shortcuts

5. App Entities: Domain Objects untuk Shortcuts

AppEntity merepresentasikan domain object app — item yang bisa dipilih user sebagai parameter intent, seperti kontak, tugas, playlist, atau produk.

Definisi AppEntity

swift
import AppIntents

// Entity merepresentasikan satu item Task di app
struct TaskEntity: AppEntity {
    // Identifier unik — digunakan untuk persistent lookup
    var id: UUID
    var title: String
    var isCompleted: Bool
    var dueDate: Date?
    var priority: PriorityLevel
    
    // Bagaimana entity ini ditampilkan di Shortcuts UI
    static var typeDisplayRepresentation: TypeDisplayRepresentation = TypeDisplayRepresentation(
        name: "Tugas",
        numericFormat: "\(placeholder: .count) tugas"
    )
    
    // Representasi satu instance entity
    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(
            title: "\(title)",
            subtitle: dueDate.map { "Tenggat: \(formatted($0))" } ?? "Tanpa tenggat",
            image: .init(systemName: isCompleted ? "checkmark.circle.fill" : "circle")
        )
    }
    
    // Bagaimana Shortcuts menemukan entity ini (via EntityQuery)
    static var defaultQuery = TaskEntityQuery()
}

// Helper formatting
private func formatted(_ date: Date) -> String {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    return formatter.string(from: date)
}

Mapping dari Domain Model ke AppEntity

swift
// Model layer app — terpisah dari AppEntity
struct Task: Identifiable, Codable {
    let id: UUID
    var title: String
    var isCompleted: Bool
    var dueDate: Date?
    var priority: PriorityLevel
}

// Extension untuk konversi
extension TaskEntity {
    init(task: Task) {
        self.id = task.id
        self.title = task.title
        self.isCompleted = task.isCompleted
        self.dueDate = task.dueDate
        self.priority = task.priority
    }
}

extension Task {
    var asEntity: TaskEntity { TaskEntity(task: self) }
}