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:

  1. Kamu meneruskan ke fungsi yang bisa memutasi (compiler tidak bisa prove tidak akan mutate)
  2. 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.