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)
    }
}