Section 12/201 menit
12. nonisolated pada Stored Property
12. nonisolated pada Stored Property
Teori: Granularitas Lebih Tinggi
Di Swift 6.0, nonisolated hanya bisa diterapkan pada computed properties dan methods dari actor. Swift 6.1 memperluas ini ke stored properties — memberikan kontrol yang lebih granular.
Mengapa ini berguna?
Sebelumnya, jika kamu punya actor dengan beberapa property, semuanya harus diakses dengan await. Bahkan property yang immutable (thread-safe secara alami) pun harus await — overhead yang tidak perlu.
swift
// Swift 6.0: semua property butuh await, termasuk yang immutable
actor UserProfile {
let id: UUID // immutable — tidak perlu protection
let username: String // immutable — tidak perlu protection
var bio: String // mutable — butuh protection
// Workaround di Swift 6.0: computed property
nonisolated var displayID: String { id.uuidString } // OK tapi verbose
}
// Penggunaan yang verbose:
let profile = UserProfile(...)
let id = await profile.id // overhead untuk hal yang immutable
let username = await profile.username // overhead tidak perlu
swift
// Swift 6.1: nonisolated pada stored property langsung
actor UserProfile {
nonisolated let id: UUID // akses tanpa await ✓
nonisolated let username: String // akses tanpa await ✓
var bio: String // masih protected ✓
}
// Penggunaan yang lebih natural:
let profile = UserProfile(...)
print(profile.id) // tanpa await — property immutable
print(profile.username) // tanpa await — property immutable
let bio = await profile.bio // dengan await — mutable, butuh protection
Aturan nonisolated pada Stored Property
swift
actor MyActor {
// ✅ Diizinkan: let (immutable) — naturally thread-safe
nonisolated let constantValue: Int = 42
nonisolated let createdAt: Date
// ✅ Diizinkan: var dengan Sendable type + synchronization manual
nonisolated var atomicCounter: Int = 0 // ⚠️ harus handle thread-safety sendiri
// ❌ Tidak disarankan: var tanpa synchronization
// nonisolated var mutableState: String // bisa jadi data race
}
Kapan Menggunakan
Gunakan nonisolated pada stored property ketika:
- Property adalah
let(immutable) — definitif aman - Property represent identity atau metadata yang tidak berubah
- Mengurangi overhead
awaituntuk data yang sering diakses dan tidak berubah
Jangan gunakan ketika:
- Property adalah
vartanpa explicit synchronization - Tidak yakin apakah concurrent access aman