Episode ini membahas penyimpanan data di Swift: bekerja dengan FileManager dan URL untuk membaca serta menulis file lokal, serialisasi dengan protocol Codable untuk JSON dan plist, penyimpanan ringan UserDefaults, Keychain untuk secret, serta gambaran umum Core Data untuk persistence yang kompleks.

Aplikasi yang berguna menyimpan data — dan data itu harus tetap ada setelah aplikasi ditutup. Episode 7 membahas data persistence dan file I/O di Swift: bagaimana membaca dan menulis file lewat FileManager dan URL, melakukan serialisasi dengan protocol Codable, memakai UserDefaults untuk preferensi, serta memahami kapan Core Data dibutuhkan.
Fondasi di episode ini akan dipakai di hampir semua aplikasi nyata: cache offline, draft pengguna, preferensi, hingga database lokal. Pilih lapisan penyimpanan yang tepat untuk kebutuhan kalian — setiap lapisan punya kekuatan dan biaya masing-masing.
Segala operasi file di Swift berbasis URL. FileManager menyediakan lokasi standar seperti Documents dan Caches:
import Foundation
let fm = FileManager.default
let docs = try fm.url(for: .documentDirectory, in: .userDomainMask,
appropriateFor: nil, create: true)
print(docs.path)fm.url(for:in:appropriateFor:create:) mengembalikan URL direktori dokumen aplikasi sandbox. Selalu gunakan API ini alih-alih hardcode path — lokasi sandbox berubah antar versi dan perangkat.
Menulis dan membaca teks cukup dengan satu panggilan:
let catatan = "Ini isi catatan pertama\n"
let fileURL = docs.appendingPathComponent("catatan.txt")
try catatan.write(to: fileURL, atomically: true, encoding: .utf8)
let isi = try String(contentsOf: fileURL, encoding: .utf8)
print(isi)catatan.write(to:atomically:encoding:) menyimpan teks secara atomik — file sementara ditulis lalu diganti, sehingga pembaca lain tidak pernah melihat file setengah jadi. String(contentsOf:encoding:) membaca seluruh isi file. Jangan lupa setiap operasi ini bisa melempar error yang harus ditangani dengan try.
Protocol Codable membuat struct Swift bisa diubah menjadi JSON, plist, dan format lain secara otomatis. Cukup nyatakan kepatuhan pada protocol:
struct Pengguna: Codable {
let nama: String
let email: String
let skor: Int
}
let pengguna = Pengguna(nama: "Arman", email: "arman@example.com", skor: 100)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(pengguna)
print(String(data: data, encoding: .utf8)!)struct Pengguna: Codable menyerahkan seluruh serialisasi ke compiler — selama semua properti juga Codable. JSONEncoder mengubah instance menjadi Data, dan JSONDecoder melakukan arah sebaliknya.
Sering kunci JSON berbeda dari nama properti Swift. Gunakan CodingKeys untuk memetakan:
struct Post: Codable {
let id: Int
let judul: String
enum CodingKeys: String, CodingKey {
case id
case judul = "title"
}
}case judul = "title" memberitahu decoder bahwa properti judul dipetakan dari kunci JSON title. Pemetaan ini esensial saat mengonsumsi API yang memakai naming convention berbeda (episode 8 akan memanfaatkannya).
UserDefaults adalah tempat paling tepat untuk data kecil seperti setting dan preferensi pengguna:
let defaults = UserDefaults.standard
defaults.set("gelap", forKey: "temaAplikasi")
defaults.set(true, forKey: "notifikasiAktif")
let tema = defaults.string(forKey: "temaAplikasi") ?? "terang"
print(tema)defaults.set("gelap", forKey: "temaAplikasi") menyimpan nilai yang langsung tersedia di peluncuran berikutnya. UserDefaults cocok untuk data hingga beberapa kilobyte — jangan simpan dokumen besar atau daftar panjang di sini.
Credential, token, dan data sensitif harus masuk Keychain, bukan UserDefaults atau file biasa. Keychain mengenkripsi data dan mengikatnya ke perangkat. Pada platform Apple, gunakan API Security framework; di server-side, gunakan environment variables:
import Foundation
let apiKey = ProcessInfo.processInfo.environment["API_KEY"] ?? ""
print("Kunci ada: \(!apiKey.isEmpty)")ProcessInfo.processInfo.environment["API_KEY"] membaca variabel environment — pola utama untuk secret di Swift server-side dan CI. Keychain di iOS akan kita bedah lengkap di episode 11.
Untuk data relasional yang besar, seperti ribuan entitas dengan relasi, Core Data adalah framework persistence utama Apple. Ia menyediakan model data terkelola, query berbasis fetch request, perubahan bertahap, dan integrasi penuh dengan SwiftUI lewat property wrapper seperti @FetchRequest.
Kapan memilih Core Data:
Info
Aturan pemilihan yang umum: UserDefaults untuk setting, file JSON untuk data sederhana, Keychain untuk secret, dan Core Data atau SQLite untuk data relasional yang besar. Tidak ada jawaban tunggal — sesuaikan dengan pola akses data aplikasi kalian.
Rangkuman keputusan yang sering kalian hadapi:
Mulailah dari lapisan paling sederhana yang memenuhi kebutuhan, lalu naik lapisan saat masalah muncul. Optimasi prematur pada lapisan persistence justru menambah kompleksitas yang tidak perlu.
Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita akan membahas networking dan API integration — HTTP request dengan URLSession, parsing JSON dengan Codable beserta penanganan error respons, modern concurrency dengan async/await, serta praktik terbaik networking seperti caching, retries, dan request timeout. Aplikasi kalian akan mulai berbicara dengan dunia luar!