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