Section 4/111 menit
4. borrowing — Read-Only Access
4. borrowing — Read-Only Access
Konsep
borrowing menyatakan: "Saya hanya membaca nilai ini. Saya tidak akan menyimpannya, mengubahnya, atau mengambil kepemilikannya. Caller tetap memiliki nilai setelah fungsi ini selesai."
swift
struct DocumentData {
var pages: [[String]] // bisa ribuan halaman
var metadata: [String: String]
}
// 'borrowing': tidak ada copy, tidak ada ownership transfer
func wordCount(_ doc: borrowing DocumentData) -> Int {
doc.pages.flatMap { $0 }.joined(separator: " ")
.components(separatedBy: .whitespaces).count
}
// Penggunaan:
let document = DocumentData(pages: largePages, metadata: [:])
let count = wordCount(document) // tidak ada copy!
print(count)
// document masih bisa dipakai di sini — borrow selesai
let preview = wordCount(document) // borrow lagi — fine
Aturan borrowing
swift
func inspect(value: borrowing LargeStruct) {
print(value.field) // ✅ baca — OK
// value.field = "new" // ❌ mutasi — tidak diizinkan
// let copy = value // ❌ copy explicit — tidak diizinkan tanpa 'copy' keyword
// someVar = value // ❌ menyimpan — tidak diizinkan
// asyncFunc(value) // ❌ escape ke async — tidak diizinkan
}
borrowing dan Protocol Conformance
swift
protocol Inspectable {
func inspect() -> String
}
struct LargeData: Inspectable {
var items: [String]
// borrowing method: tidak ada copy self
borrowing func inspect() -> String {
items.prefix(5).joined(separator: ", ")
}
// Ini berbeda dari 'nonisolated' di actor — ini tentang copy
// mutating func: caller mendapat versi yang sudah dimodifikasi
mutating func append(_ item: String) {
items.append(item)
}
}