Episode ini membahas tipe data lanjutan Swift: Array, Dictionary, Set, dan tuple sebagai koleksi, optional dengan optional chaining dan nil coalescing, enum dengan associated values dan raw values, serta perbedaan mendasar struct dan class dalam value semantics dan reference semantics.

Setelah menguasai sintaks dasar, kalian butuh alat untuk memodelkan data nyata. Episode 4 membahas tipe data lanjutan dan koleksi Swift — Array, Dictionary, Set, tuple, optional, dan enum — yang menjadi tulang punggung setiap aplikasi, dari model data sampai state management.
Di episode ini juga kita membedah salah satu konsep paling penting dan paling sering disalahpahami: perbedaan struct dan class dalam value semantics versus reference semantics. Keputusan memilih salah satunya akan memengaruhi performa, thread safety, dan desain keseluruhan aplikasi kalian.
Tiga koleksi utama Swift melayani kebutuhan berbeda:
var kota = ["Jakarta", "Bandung", "Surabaya"]
kota.append("Yogyakarta")
print(kota.count)
var populasi = ["Jakarta": 10_562_088, "Bandung": 2_444_160]
populasi["Surabaya"] = 2_874_314
let favorit: Set = ["swift", "rust", "swift"]
print(favorit)kota.append("Yogyakarta") menambah elemen di akhir Array. Set otomatis mendeduplikasi: favorit hanya menyimpan swift sekali. Pemilihan koleksi yang tepat menyederhanakan logika kalian — gunakan Set untuk pengujian keanggotaan dan mencegah duplikasi.
Tuple menggabungkan beberapa nilai dalam satu nilai majemuk tanpa perlu tipe khusus:
let koordinat = (x: 10, y: 20)
let (x, y) = koordinat
print("Lokasi: \(x), \(y)")(x: 10, y: 20) membuat tuple dengan label yang bisa diakses langsung. Tuple berguna untuk nilai kembalian fungsi yang ringkas dan sementara — untuk data yang dipakai berulang, lebih baik definisikan struct.
Optional adalah fitur inti yang membedakan Swift dari bahasa pendahulunya: sebuah nilai bisa ada atau tidak, dan compiler memaksa kalian menangani kedua kemungkinan. Deklarasi optional ditandai tanda tanya:
var namaPengguna: String? = nil
let teksTampil = namaPengguna ?? "Tamu"
print(teksTampil)Operator ?? — nil coalescing — memberikan nilai default saat optional kosong. namaPengguna ?? "Tamu" menghindari akses nil tanpa menulis seluruh blok if-let.
Untuk mengakses properti atau method di dalam optional, gunakan optional chaining dengan tanda tanya:
struct Profil {
var nama: String
var bio: String?
}
let profil = Profil(nama: "Arman", bio: "Cloud Engineer")
let bioPanjang = profil.bio?.count ?? 0
print(bioPanjang)profil.bio?.count mengembalikan nil jika bio nil, dan jika tidak, nilai count. Rantai berhenti aman di titik pertama yang nil — pola ini mengurangi banyak percabangan defensif.
Enum di Swift jauh lebih kuat dari enum di C: bisa membawa nilai mentah (raw values) sekaligus nilai terkait (associated values):
enum StatusKoneksi: String {
case online = "terhubung"
case offline = "putus"
}
let status = StatusKoneksi.online
print(status.rawValue)enum Hasil {
case sukses(data: String)
case gagal(pesan: String)
}
let hasil = Hasil.gagal(pesan: "Timeout")
print(hasil)case sukses(data: String) membawa data tambahan melekat pada case. Dipadukan dengan switch dan pattern matching, enum menjadi cara paling aman mewakili state dan hasil operasi — kita akan memakainya lagi di episode 6 untuk error handling.
Perbedaan paling fundamental antara struct dan class ada pada cara nilai disalin:
struct Titik {
var x: Int
var y: Int
}
var a = Titik(x: 1, y: 2)
var b = a
b.x = 99
print(a.x, b.x)
class Kereta {
var posisi = 0
}
let k1 = Kereta()
let k2 = k1
k2.posisi = 10
print(k1.posisi, k2.posisi)Pada struct, mengubah b.x tidak mengubah a karena b adalah salinan. Pada class, k1 dan k2 menunjuk objek yang sama sehingga keduanya membaca 10.
Pedoman Swift yang diterima luas: default ke struct. Struct memberi immutability alami, aman untuk concurrent, dan murah berkat copy-on-write. Gunakan class saat butuh identity (dua referensi harus menunjuk objek yang sama), pewarisan, atau interoperasi dengan API Objective-C yang mengandalkan referensi.
Info
Swift compiler mengoptimasi salinan struct dengan copy-on-write: salinan nyata baru terjadi saat nilai diubah. Jadi memakai struct tidak berarti menyalin data besar setiap saat.
Inti yang harus dibawa pulang:
?? memberi nilai default saat nil.?. menjaga akses properti tetap aman.Di episode 5 selanjutnya kita akan membahas pemrograman berorientasi objek dan protocols — class, inheritance, dan method overriding, access control dari public sampai private, protocols beserta protocol extensions sebagai inti protocol-oriented programming, serta generics dengan type constraints. Mari lanjut!