Section 6/91 menit
6. Kapan Harus Digunakan
6. Kapan Harus Digunakan
Gunakan ~Copyable ketika:
1. Resource yang harus di-release tepat sekali
swift
struct DatabaseTransaction: ~Copyable {
private let connectionID: Int
private var committed = false
consuming func commit() {
committed = true
// ... commit transaction
}
deinit {
if !committed {
// Otomatis rollback jika tidak di-commit — tidak ada resource leak
rollback(connectionID)
}
}
}
2. Unique ownership token / capability
swift
// Hanya satu holder yang boleh menulis ke file pada satu waktu
struct WritePermission: ~Copyable {
let fileID: String
deinit {
releaseWriteLock(fileID) // lock pasti di-release
}
}
func getWritePermission(for fileID: String) -> WritePermission? {
guard acquireWriteLock(fileID) else { return nil }
return WritePermission(fileID: fileID)
}
3. Kriptografi dan sensitive data
swift
struct PrivateKey: ~Copyable {
private var keyBytes: [UInt8]
deinit {
// Zero-out memori saat key tidak dibutuhkan lagi
keyBytes = Array(repeating: 0, count: keyBytes.count)
}
borrowing func sign(_ data: Data) -> Signature {
// Gunakan keyBytes untuk signing
return Signature(bytes: [])
}
}
4. Mencegah use-after-free bug
swift
struct UnsafeBuffer: ~Copyable {
private let pointer: UnsafeMutablePointer<UInt8>
private let count: Int
init(count: Int) {
pointer = .allocate(capacity: count)
self.count = count
}
deinit {
pointer.deallocate() // dijamin dipanggil tepat sekali
}
}