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