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