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