Section 1/111 menit
1. Masalah yang Dipecahkan
1. Masalah yang Dipecahkan
Copy yang Tidak Perlu: Biaya Tersembunyi
Swift secara default meng-copy value type ketika diteruskan ke fungsi. Untuk tipe kecil (Int, Bool, CGPoint), ini murah dan tidak masalah. Tapi untuk tipe besar, copy ini bisa menjadi overhead yang signifikan:
swift
struct LargeImage {
var pixels: [UInt8] // bisa ratusan MB
var width: Int
var height: Int
}
// Setiap kali ini dipanggil, Swift COPY seluruh pixels array!
func analyze(_ image: LargeImage) -> AnalysisResult {
// image adalah SALINAN — copy terjadi di pemanggilan
return process(image.pixels)
}
// Tiga copy jika dipanggil tiga kali:
let report1 = analyze(myImage) // copy #1
let report2 = analyze(myImage) // copy #2
let report3 = analyze(myImage) // copy #3
Mengapa Swift copy by default?
Swift menggunakan Copy-on-Write (CoW) untuk collection types — copy hanya terjadi saat ada mutation. Tapi copy tetap terjadi jika:
- Kamu meneruskan ke fungsi yang bisa memutasi (compiler tidak bisa prove tidak akan mutate)
- Batas antara non-CoW types
Apa yang developer butuhkan:
- Cara untuk menyatakan: "fungsi ini HANYA membaca, tidak akan memutasi atau menyimpan"
- Cara untuk menyatakan: "fungsi ini mengambil alih nilai, caller tidak butuh lagi"
Ini adalah inti dari borrowing dan consuming.
Masalah Keterbacaan: Intent yang Tidak Jelas
swift
// Apakah fungsi ini menyimpan reference ke image?
// Apakah aman untuk menggunakan image setelah ini?
// Tidak ada cara tahu dari signature saja:
func upload(_ image: UIImage) async { }
func cache(_ image: UIImage) { }
func process(_ image: UIImage) -> Result { }
Dengan borrowing dan consuming, intent menjadi bagian dari API contract yang di-enforce compiler.