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