Section 2/111 menit
2. Teori: Ownership dan Copy Semantics
2. Teori: Ownership dan Copy Semantics
Tiga Model Melewatkan Value
swift
┌─────────────────────────────────────────────────────────┐
│ Caller memiliki nilai X │
└──────────────────────┬──────────────────────────────────┘
│ bagaimana X diteruskan ke callee?
┌───────────┼───────────────┐
▼ ▼ ▼
borrowing consuming inout
───────────── ────────────── ──────────────
Caller masih Ownership Caller masih
pegang X berpindah ke pegang X, tapi
Callee: read callee callee bisa
only Caller: tidak modifikasi X
bisa pakai X lagi langsung
Mengapa Borrowing Lebih Efisien dari Default
Default Swift (tanpa annotation) menggunakan "let-binding" — compiler melakukan analisis dan mungkin melakukan copy atau tidak. Perilakunya bergantung pada banyak faktor dan tidak bisa diprediksi developer.
borrowing memberi jaminan explicit: "tidak ada copy yang dilakukan, nilai hanya dipinjam secara read-only."
swift
Default (tanpa annotation):
Caller → [mungkin copy] → Callee
Compiler memutuskan — tidak bisa diprediksi
borrowing:
Caller → [reference/borrow, tidak ada copy] → Callee
Compile-time guarantee
consuming:
Caller → [move, tidak ada copy] → Callee
Caller tidak bisa akses lagi, tidak ada copy
Hubungan dengan ~Copyable
borrowing dan consuming adalah konsep yang sudah ada di Swift bahkan sebelum ~Copyable, tapi menjadi wajib untuk parameter ~Copyable karena compiler harus tahu bagaimana menangani nilai yang tidak bisa di-copy:
swift
struct NonCopyableHandle: ~Copyable { }
// Tanpa annotation, compiler tidak tahu harus borrow atau consume
// Dengan ~Copyable, kamu HARUS tentukan:
func inspect(handle: borrowing NonCopyableHandle) { } // wajib explicit
func transfer(handle: consuming NonCopyableHandle) { } // wajib explicit