Section 4/91 menit

4. consuming, borrowing, dan copy

4. consuming, borrowing, dan copy

consuming — Transfer Ownership ke Callee

swift
struct Token: ~Copyable {
    let value: String
    let expiresAt: Date
    
    // consuming: method ini menghabiskan token setelah dipanggil
    consuming func use() -> AuthResult {
        // Token tidak bisa dipakai lagi setelah ini
        return AuthResult(token: self.value)
    }
}

// consuming parameter: caller tidak bisa pakai 'token' setelah memanggil ini
func authenticate(with token: consuming Token) async -> Bool {
    let result = token.use()  // ownership berpindah ke use()
    // token tidak bisa dipakai lagi
    return result.isValid
}

func loginFlow() async {
    let token = Token(value: "abc123", expiresAt: .now.addingTimeInterval(3600))
    let success = await authenticate(with: token)  // token di-consume di sini
    // ❌ ERROR: token sudah di-consume
    // print(token.value)
}

borrowing — Pinjam Tanpa Ambil Ownership

swift
// borrowing parameter: caller tetap memegang ownership setelah call
func inspect(handle: borrowing FileHandle) -> FileInfo {
    // Bisa baca dari handle, tapi tidak bisa consume atau mutate
    let size = getFileSize(handle)
    return FileInfo(size: size)
}

func processFile() {
    guard let file = FileHandle(path: "/data.bin") else { return }
    
    let info = inspect(handle: file)  // file dipinjam, tidak di-consume
    print("File size: \(info.size)")
    
    // file masih valid di sini!
    if let data = file.read(count: info.size) {
        process(data)
    }
    // file di-close saat keluar scope
}

copy Keyword — Explicit Copy untuk Noncopyable Fields

swift
struct Wrapper<T: ~Copyable>: ~Copyable {
    var value: T
    
    // Mengakses field noncopyable butuh borrowing atau consuming
    borrowing func inspect() -> String {
        // 'copy' keyword tidak tersedia untuk noncopyable — tapi untuk copyable fields:
        let description = value  // ini borrow, bukan copy
        return "\(description)"
    }
}