โ† Back to list

๐Ÿงฌ 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โ€ฆ

Af Wave ยท 2025-04-15 05:06 ยท 0 claps ยท 1.3 min read
#swiftui #encode #learn #learning-to-code #hacking-with-swift
Open on Medium โ†—
Wiki topics: EDU ยท Education & Learning ๐ŸŒ ยท Web Development ๐Ÿ“ฑ ยท Mobile Development ๐Ÿ”’ ยท Cybersecurity

๐Ÿงฌ 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