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 await untuk data yang sering diakses dan tidak berubah

Jangan gunakan ketika:

  • Property adalah var tanpa explicit synchronization
  • Tidak yakin apakah concurrent access aman