Section 10/201 menit

10. @preconcurrency

10. @preconcurrency

Teori: Jembatan ke Kode Lama

@preconcurrency adalah annotation untuk menangani backward compatibility — ketika kamu menggunakan library atau framework yang ditulis sebelum Swift concurrency ada, dan mereka belum di-update.

Dua penggunaan utama:

Penggunaan 1: Import module lama

swift
// Library lama yang belum punya Sendable annotation
@preconcurrency import LegacyNetworkLibrary

// Dengan @preconcurrency import:
// - Compiler mengurangi strictness untuk tipe dari LegacyNetworkLibrary
// - Warning yang muncul menjadi lebih ringan (bukan error)
// - Kamu bisa bermigrasi bertahap

Penggunaan 2: Protocol conformance lama

swift
// Protocol yang ditulis sebelum concurrency — tidak ada Sendable requirement
protocol LegacyDelegate {
    func didComplete(result: SomeResult)
}

// Class yang conform dengan @preconcurrency — relaxed checking
class MyHandler: @preconcurrency LegacyDelegate {
    @MainActor
    func didComplete(result: SomeResult) {
        // Compiler tidak akan error meskipun ada isolation mismatch
        // dengan protocol yang tidak mengenal isolation
    }
}

Kapan Menggunakan

Gunakan @preconcurrency ketika:

  • Mengimport third-party library yang belum di-update ke Swift Concurrency
  • Conform ke protocol dari Objective-C atau pre-concurrency framework
  • Dalam proses migrasi bertahap — sementara, bukan solusi permanen

Jangan gunakan ketika:

  • Kode yang kamu kontrol — update saja dengan proper isolation
  • Sebagai cara menghindari fix yang seharusnya dilakukan
  • Dalam kode baru — ini adalah tool migrasi, bukan desain normal
swift
// Contoh: UIKit delegate yang belum di-annotate @MainActor oleh Apple
class ViewController: UIViewController, @preconcurrency UITableViewDelegate {
    // UITableViewDelegate belum punya @MainActor di semua versi SDK
    // @preconcurrency: "saya tahu ini akan jalan di main thread"

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Dijamin main thread karena UITableViewDelegate
    }
}