0Pricing
Swift Academy · Pelajaran

Sendable dan pemeriksaan keamanan thread

Tandai data sebagai Sendable , tulis closure @Sendable , dan pilih antara tipe nilai, actor, serta @unchecked Sendable untuk berbagi data dengan aman antar-thread.

Sendable dan pemeriksaan keamanan thread adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 3 pelajaran total.

Apa itu Sendable?

Sendable adalah cara Swift memastikan bahwa data aman untuk diteruskan di antara tugas atau actor yang berjalan secara bersamaan.

  • Sebagian besar struktur dan enum secara otomatis bersifat Sendable.
  • Kelas secara bawaan bukan Sendable.
  • Gunakan actor atau @unchecked Sendable—yang jarang digunakan dan memerlukan keamanan manual.

Tipe nilai itu mudah

Struktur dengan anggota Sendable bersifat Sendable; meneruskannya di antara tugas aman dilakukan.

// Value types with value-only stored properties are Sendable.
// They are safe to transfer across tasks.
struct Point: Sendable { let x: Int; let y: Int }

func shift(_ p: Point) -> Point { Point(x: p.x + 1, y: p.y + 1) }

// Use in parallel tasks
Task {
    let p = Point(x: 1, y: 2)
    async let a = shift(p)
    async let b = shift(p)
    let (p1, p2) = await (a, b)
    print(p1, p2) // Point(x: 2, y: 3) Point(x: 2, y: 3)
}

Kelas: gunakan actor

Actor membuat semantik referensi aman di antara tugas dengan menserialisasi akses.

// Reference types (class) are not Sendable by default.
// Prefer actors to guard mutable state.
actor SafeCounter {
    private var value = 0
    func inc() { value += 1 }
    func read() -> Int { value }
}

let counter = SafeCounter()
Task {
    async let t1 = counter.inc()
    async let t2 = counter.inc()
    _ = await (t1, t2)
    print(await counter.read()) // 2
}

// (Alternative) A plain class would need locks + @unchecked Sendable; see later.

Closure @Sendable

Tandai closure dengan @Sendable ketika closure tersebut mungkin berjalan pada pelaksana lain. Hindari menangkap status berubah yang bukan Sendable.

// Some APIs require closures to be @Sendable so captured values are safe.
func doTwice(_ f: @Sendable () -> Int) -> Int { f() + f() }

let base = 10
// Capturing an immutable value (let) is fine for @Sendable closures.
let result = doTwice { base + 1 }
print(result) // 22

// Detached tasks also use @Sendable under the hood:
let t = Task.detached { () -> Int in
    // Do not capture non-Sendable mutable state here.
    return 5 * 5
}
Task { print(await t.value) }

@unchecked Sendable (lanjutan)

@unchecked Sendable menonaktifkan pemeriksaan kompiler. Gunakan hanya dengan sinkronisasi internal yang ketat, seperti kunci atau antrean, dan sebagai pilihan terakhir.

import Foundation

// Only when you KNOW it is safe: wrap with a lock and mark @unchecked Sendable.
final class Box<T>: @unchecked Sendable {
    private var value: T
    private let lock = NSLock()

    init(_ value: T) { self.value = value }

    func read() -> T {
        lock.lock(); defer { lock.unlock() }
        return value
    }

    func write(_ newValue: T) {
        lock.lock(); value = newValue; lock.unlock()
    }
}

let shared = Box<Int>(0)
let a = Task.detached { shared.write(1) }
let b = Task.detached { shared.write(2) }
Task {
    _ = await (a.value, b.value)
    print(shared.read()) // 1 or 2 (last writer wins, but no data race)
}

Praktik terbaik

Panduan:

  • Utamakan tipe nilai yang ramah terhadap Sendable.
  • Gunakan actor untuk status bersama yang dapat diubah.
  • Tulis closure @Sendable; hindari menangkap nilai berubah yang bukan Sendable.
  • Gunakan @unchecked Sendable hanya dengan sinkronisasi yang sangat ketat.

Makna Sendable

Pemeriksaan singkat: Apa yang dijanjikan Sendable?

Ringkasan

Ringkasan: Gunakan Sendable untuk memodelkan keamanan lintas task, utamakan aktor atau tipe nilai, tulis fungsi anonim ber-@Sendable, dan gunakan @unchecked Sendable hanya untuk internal yang tersinkronisasi dengan baik.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Sendable dan pemeriksaan keamanan thread” gratis?

Ya — teks lengkap “Sendable dan pemeriksaan keamanan thread” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Sendable dan pemeriksaan keamanan thread”?

Tandai data sebagai Sendable , tulis closure @Sendable , dan pilih antara tipe nilai, actor, serta @unchecked Sendable untuk berbagi data dengan aman antar-thread. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.

Berapa lama pelajaran “Sendable dan pemeriksaan keamanan thread” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. TaskGroup untuk paralelisme
  2. Actor dan isolasi data, nonisolated
  3. Sendable dan pemeriksaan keamanan thread
← Kembali ke Swift Academy