class DownloadCounter {
    var count = 0
    var lastDownload: Date?
}

actor DownloadManager {
    private var totalProcessed = 0  // โœ… Protected by actor
    
    func processDownload(_ counter: DownloadCounter) async {
        totalProcessed += 1           // โœ… Safe - actor's state
        
        // ๐Ÿ’ฅ DANGER: counter is NOT protected!
        counter.count += 1            // โŒ Potential data race
        counter.lastDownload = Date() // โŒ Potential data race
    }
}

// Data race scenario
func dangerousUsage() async {
    let counter = DownloadCounter()
    let manager = DownloadManager()
    
    // Thread 1
    Task {
        await manager.processDownload(counter)
    }
    
    // Thread 2 - Concurrent access!
    Task {
        counter.count += 5  // ๐Ÿ’ฅ DATA RACE with Thread 1
    }
}

โœ… The Solution: sending to Transfer Ownership

actor DownloadManager {
    private var totalProcessed = 0
    
    func processDownload(_ counter: sending DownloadCounter) async {
        totalProcessed += 1
        
        // โœ… Safe now - counter belongs exclusively to me
        counter.count += 1
        counter.lastDownload = Date()
    }
}

func safeUsage() async {
    let counter = DownloadCounter()
    let manager = DownloadManager()
    
    await manager.processDownload(counter)
    // counter is no longer accessible here โœ…
}

๐Ÿ’ก Tip: When passing a mutable object to an actor, ask yourself: “Who else can access this?” If the answer isn’t “nobody”, use sending or a safe alternative!