Section 8/181 menit

8. Atribut Lanjutan

8. Atribut Lanjutan

@Attribute untuk Kustomisasi

swift
@Model
final class User {
    // Unique constraint — throw error jika duplikat
    @Attribute(.unique)
    var email: String

    // Nama kolom kustom di database (tidak mempengaruhi Swift API)
    @Attribute(originalName: "user_name")
    var username: String

    // Enkripsi at-rest (hanya iOS 18+)
    @Attribute(.allowsCloudEncryption)
    var sensitiveNote: String?

    // Abaikan properti ini dari persistensi (sama dengan @Transient)
    @Attribute(.ephemeral)
    var sessionToken: String?

    // External storage: Data besar disimpan di luar SQLite row
    @Attribute(.externalStorage)
    var profilePhoto: Data?

    // Spotlight indexing untuk pencarian system
    @Attribute(.spotlight)
    var displayName: String

    init(email: String, username: String) {
        self.email = email
        self.username = username
        self.displayName = username
    }
}

#Unique Constraint (iOS 18+)

Di iOS 18, SwiftData menambahkan macro #Unique yang lebih fleksibel:

swift
@Model
final class Transaction {
    var transactionID: String
    var amount: Double
    var date: Date

    // Unique constraint pada kombinasi properti
    #Unique<Transaction>([\.transactionID], [\.date, \.amount])

    init(transactionID: String, amount: Double) {
        self.transactionID = transactionID
        self.amount = amount
        self.date = Date()
    }
}

Enum sebagai Persistent Property

swift
enum Priority: Int, Codable {
    case low = 0, medium = 1, high = 2, critical = 3
}

enum Category: String, Codable {
    case work = "work"
    case personal = "personal"
    case learning = "learning"
}

@Model
final class Task {
    var title: String
    var priority: Priority       // disimpan sebagai Int (raw value)
    var category: Category       // disimpan sebagai String (raw value)
    var dueDate: Date?

    init(title: String, priority: Priority = .medium, category: Category = .personal) {
        self.title = title
        self.priority = priority
        self.category = category
    }
}