Section 4/181 menit
4. Sintaks Dasar: @Model
4. Sintaks Dasar: @Model
@Model adalah attached macro yang harus diaplikasikan ke class (bukan struct — SwiftData membutuhkan reference semantics untuk identity management).
swift
// Definisi model minimal
import SwiftData
@Model
final class Book {
var title: String
var author: String
var publishedYear: Int
var isRead: Bool
var addedAt: Date
init(title: String, author: String, publishedYear: Int) {
self.title = title
self.author = author
self.publishedYear = publishedYear
self.isRead = false
self.addedAt = Date()
}
}
Tipe Data yang Didukung
SwiftData mendukung tipe-tipe berikut sebagai persistent property:
| Kategori | Tipe |
|---|---|
| Numerik | Int, Int8, Int16, Int32, Int64, Float, Double |
| Teks | String |
| Boolean | Bool |
| Waktu | Date |
| Binary | Data |
| UUID | UUID |
| URL | URL |
| Codable | Semua tipe yang conform ke Codable (disimpan sebagai JSON) |
| Enum | RawRepresentable enum dengan raw type yang didukung |
| Relasi | @Model class lain (one-to-one, one-to-many) |
| Koleksi | [T] dan Set<T> untuk relasi to-many |
swift
// Contoh dengan berbagai tipe
@Model
final class UserProfile {
var username: String
var email: String
var age: Int
var rating: Double
var avatarData: Data?
var joinedAt: Date
var profileURL: URL?
var settings: AppSettings // Codable struct — disimpan sebagai JSON
var status: AccountStatus // RawRepresentable enum
init(username: String, email: String) {
self.username = username
self.email = email
self.age = 0
self.rating = 0.0
self.joinedAt = Date()
self.settings = AppSettings()
self.status = .active
}
}
struct AppSettings: Codable {
var notificationsEnabled: Bool = true
var theme: String = "system"
var language: String = "id"
}
enum AccountStatus: String, Codable {
case active, suspended, deleted
}
Properti Transient
Properti yang tidak perlu disimpan ke disk ditandai dengan @Transient:
swift
@Model
final class Document {
var title: String
var content: String
@Transient
var wordCount: Int { // dihitung dari content, tidak perlu disimpan
content.split(separator: " ").count
}
@Transient
var isCurrentlyEditing: Bool = false // state UI sementara
init(title: String, content: String = "") {
self.title = title
self.content = content
}
}