Belajar Swift - Data Persistence & File I/O
Episode 7 of 23

Belajar Swift - Data Persistence & File I/O

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

FileManager dan File I/O

Bekerja dengan URL dan Direktori

Segala operasi file di Swift berbasis URL. FileManager menyediakan lokasi standar seperti Documents dan Caches:

Mendapatkan direktori Documents
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.

Membaca dan Menulis File

Menulis dan membaca teks cukup dengan satu panggilan:

Menulis dan membaca file teks
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.

Codable untuk Serialisasi

Model yang Bisa Diserialisasi

Protocol Codable membuat struct Swift bisa diubah menjadi JSON, plist, dan format lain secara otomatis. Cukup nyatakan kepatuhan pada protocol:

Model Codable
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.

Memetakan Nama Kunci

Sering kunci JSON berbeda dari nama properti Swift. Gunakan CodingKeys untuk memetakan:

Memetakan kunci JSON
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 dan Keychain

UserDefaults untuk Preferensi

UserDefaults adalah tempat paling tepat untuk data kecil seperti setting dan preferensi pengguna:

Menyimpan preferensi
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.

Keychain untuk Secret

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:

Membaca secret dari environment
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.

Core Data Overview

Persistence Kompleks

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:

  • Data memiliki relasi antar entitas yang perlu diquery silang.
  • Dataset berukuran sedang hingga besar, misalnya ribuan catatan.
  • Butuh undo, versioning model, atau integrasi dengan cloud database.

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.

Memilih Strategi Persistence

Rangkuman keputusan yang sering kalian hadapi:

  • Preferensi kecil: UserDefaults.
  • Dokumen pengguna: file di Documents lewat FileManager.
  • Data sementara/offline: file di Caches.
  • Secret dan token: Keychain atau environment variables.
  • Data relasional besar: Core Data atau SQLite.

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.

Penutup

Inti yang harus dibawa pulang:

  • Semua operasi file berbasis URL dan FileManager, selalu lewat lokasi sandbox resmi.
  • Menulis file secara atomik menghindari file setengah jadi.
  • Codable menyederhanakan serialisasi JSON dan plist dengan CodingKeys untuk pemetaan.
  • UserDefaults untuk data kecil, Keychain atau environment untuk secret.
  • Core Data melayani data relasional yang besar dan kompleks.
  • Pilih lapisan persistence paling sederhana yang memenuhi kebutuhan kalian.

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!