Section 13/201 menit

13. Improved Actor Isolation Inference

13. Improved Actor Isolation Inference

Teori: Lebih Sedikit Annotation Manual

Swift 6.1 meningkatkan kemampuan compiler untuk meng-infer isolation secara otomatis dalam lebih banyak kasus — mengurangi kebutuhan annotation eksplisit.

Improvement utama:

swift
// Swift 6.0: perlu annotation eksplisit di banyak tempat
@MainActor
class ViewController: UIViewController {
    @MainActor  // perlu explicit di Swift 6.0
    func handleTap() { }

    @MainActor  // perlu explicit di Swift 6.0
    var displayText: String = ""
}

// Swift 6.1: isolation diinfer dari context class
@MainActor
class ViewController: UIViewController {
    // Tidak perlu annotation ulang — sudah diinfer dari class
    func handleTap() { }       // diinfer @MainActor ✓
    var displayText: String = "" // diinfer @MainActor ✓
}

Protocol conformance inference:

swift
@MainActor
protocol MainActorProtocol {
    func update()
}

// Swift 6.1: conformance meng-infer isolation ke semua methods
class MyClass: MainActorProtocol {
    func update() {
        // Diinfer @MainActor karena protocol isolation
        // Tidak perlu @MainActor annotation eksplisit di method ini
    }
}

Dampak Praktis

swift
// Sebelum Swift 6.1: banyak annotation repetitif
@MainActor class HomeViewController: UIViewController {
    @MainActor private var viewModel: HomeViewModel
    @MainActor override func viewDidLoad() { super.viewDidLoad() }
    @MainActor override func viewWillAppear(_ animated: Bool) { }
    @MainActor func updateUI() { }
    @MainActor func handleError(_ error: Error) { }
}

// Swift 6.1: annotation di class sudah cukup
@MainActor class HomeViewController: UIViewController {
    private var viewModel: HomeViewModel       // diinfer @MainActor
    override func viewDidLoad() {              // diinfer @MainActor
        super.viewDidLoad()
    }
    override func viewWillAppear(_ animated: Bool) { }  // diinfer
    func updateUI() { }                        // diinfer @MainActor
    func handleError(_ error: Error) { }       // diinfer @MainActor
}