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
}
}