๐งฌ Meng-Encode Observable Class untuk Dikirim ke Server dalam SwiftUI
Di era modern app development, sering kali kita berurusan dengan pertukaran data antara frontend dan backend menggunakan format JSON. Swiftโฆ
๐งฌ Meng-Encode Observable Class untuk Dikirim ke Server dalam SwiftUI
Di era modern app development, sering kali kita berurusan dengan pertukaran data antara frontend dan backend menggunakan format JSON. Swift telah mempermudah hal ini lewat protokol Codable, yang memungkinkan kita untuk dengan mudah encode/decode model data kita.
Namun, akan muncul masalah menarik ketika kita mencoba meng-encode Observable class, terutama yang menggunakan SwiftUI annotation seperti @Observable (khususnya di SwiftData / Swift macros yang baru).
๐ก Studi Kasus: Observable User Class
Misalkan kita punya class User seperti berikut:
@Observable
class User: Codable {
var username: String = "user1"
}
Dan kita mencoba encode-nya seperti ini:
func encodeUser(){
let data = try! JSONEncoder().encode(User())
let jsonString = String(decoding: data, as: UTF8.self)
print(jsonString)
}
Ketika kita menekan encode class tersebut, hasilnya akan seperti ini:
{"_username":"user1","_$observationRegistrar":{}}
๐จ What Just Happened?
Mari kita bahas satu per satu:
- @Observable menambahkan behavior untuk pengamatan perubahan data (mirip dengan @Published, tapi lebih powerful dan native lewat macro).
- Properti _$observationRegistrar adalah internal SwiftUI plumbing, digunakan untuk tracking siapa yang mengamati perubahan pada class ini. Ini adalah properti teknis yang tidak kita butuhkan untuk dikirim ke server.
- Properti username berubah menjadi โ_usernameโ karena Swift secara internal membuatnya private dan menambahkan underscore sebagai prefiks untuk tujuan pengamatan.
โ Masalah yang Terjadi
- Key โ_usernameโ tidak sesuai dengan yang server harapkan (โusernameโ).
- Key โ_$observationRegistrarโ adalah internal dan tidak boleh dikirim ke backend.
- Ini membuat JSON kita tidak sesuai kontrak API yang server harapkan.
๐ ๏ธ Solusi: Gunakan CodingKeys untuk Mapping Kunci JSON
Untuk mengatasi masalah tersebut, kita perlu menginformasikan kepada JSONEncoder bahwa _username seharusnya dipetakan sebagai โusernameโ, dan properti internal lainnya tidak perlu ikut diserialisasi.
@Observable
class User: Codable {
enum CodingKeys: String, CodingKey {
case _username = "username"
}
var username: String = "user1"
}
- CodingKeys adalah enum yang mengimplementasikan CodingKey protocol.
- Dengan menyebut _username = โusernameโ, kita secara eksplisit memberi tahu encoder untuk menggunakan key username saat encode.
- Properti _$observationRegistrar secara otomatis tidak akan diikutsertakan, karena hanya properti yang ada di CodingKeys yang akan di-encode.
โ Hasil JSON Sekarang:
{"username":"user1"} ๋ฉํ๋ฐ์ดํฐ
- post_id
- bf457efd2612
- slug
- meng-encode-observable-class-untuk-dikirim-ke-server-dalam-swiftui-bf457efd2612
- url
- https://medium.com/@avwave12/meng-encode-observable-class-untuk-dikirim-ke-server-dalam-swiftui-bf457efd2612
- canonical_url
- https://medium.com/@avwave12/meng-encode-observable-class-untuk-dikirim-ke-server-dalam-swiftui-bf457efd2612
- author_url
- https://medium.com/@avwave12
- status
- ok
- fetched_at
- 2026-07-20 07:40:56