Section 8/201 menit
8. sending Modifier
8. sending Modifier
Teori: Region-Based Isolation
sending adalah bagian dari region-based isolation — sistem analisis yang lebih halus dari sekadar "apakah tipe ini Sendable?".
Sebelum sending, aturannya binary: tipe harus Sendable untuk bisa dikirim lintas isolation. Ini terlalu ketat — banyak nilai yang aman untuk dikirim jika caller tidak mengaksesnya lagi setelah pengiriman.
sending mengkodekan transfer of ownership ke type system: nilai ini dipindahkan ke isolation domain lain, dan caller tidak boleh mengaksesnya lagi.
swift
// Tanpa sending: URLRequest tidak Sendable di Swift 5.x
// → tidak bisa dikirim ke async context
// Dengan sending: bisa, asalkan caller tidak akses lagi
func processRequest(_ request: sending URLRequest) async throws -> Data {
// request sekarang milik fungsi ini
var mutableRequest = request // OK: kita memilikinya
mutableRequest.setValue("v2", forHTTPHeaderField: "API-Version")
let (data, _) = try await URLSession.shared.data(for: mutableRequest)
return data
}
// Penggunaan:
var request = URLRequest(url: someURL)
request.httpMethod = "POST"
let data = try await processRequest(request) // request di-"kirim"
// print(request.httpMethod) // ❌ ERROR: request sudah di-transfer
sending pada Return Type
swift
// Fungsi yang menghasilkan nilai untuk dikirim ke isolation lain
actor DataStore {
func getItemForProcessing(id: String) -> sending ProcessingJob {
// ProcessingJob tidak harus Sendable
// tapi karena di-return dengan 'sending', caller bisa kirim ke isolation lain
return ProcessingJob(id: id, data: store[id])
}
}
Kapan Menggunakan
Gunakan sending ketika:
- Fungsi mengkonsumsi nilai dan mengirimkannya ke async context lain
- Tipe tidak Sendable tapi safe untuk di-transfer (ownership jelas)
- Builder pattern yang menghasilkan objek untuk digunakan di isolation berbeda
Jangan gunakan sending ketika:
- Caller masih butuh nilai setelah call
- Tipe bisa dibuat Sendable (struct dengan value types)
- Ada concurrent access yang mungkin terjadi