0Pricing
Swift Academy · Pelajaran

Protocol Sendable

Tandai tipe yang aman melintasi ranah konkurensi.

Protocol Sendable adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. 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 4 pelajaran total.

Makna Dapat Dikirim

Sendable adalah protokol penanda. Tipe yang mematuhinya menjanjikan bahwa tipe tersebut aman dibagikan lintas domain konkurensi tanpa menimbulkan perlombaan data.

Protokol ini tidak memiliki metode; protokol ini merupakan jaminan keamanan utas yang diperiksa oleh kompilator.

protocol Sendable {}

Tipe Nilai Sering Dapat Dikirim

Struktur dan enumerasi yang semua properti tersimpannya bertipe Sendable dapat mematuhinya secara otomatis.

Karena nilai disalin saat diteruskan, setiap tugas mendapatkan salinan independen miliknya sendiri.

struct User: Sendable {
    let id: Int
    let name: String
}

Kesesuaian Implisit

Banyak tipe nilai memperoleh Sendable secara implisit: struktur dan enumerasi beku non-publik dengan anggota Sendable, tuple yang elemennya bertipe Sendable, serta metatipe.

Anda sering kali tidak perlu menulis : Sendable sama sekali untuk tipe nilai internal.

enum Direction { case north, south, east, west }
// Implicitly Sendable: no associated non-Sendable data

Kapan Struktur NOT Dapat Dikirim

Jika sebuah struktur menyimpan properti tersimpan yang bukan Sendable, struktur tersebut tidak dapat dikirim.

Di sini, referensi kelas membuat keadaan mutable bersama dapat dijangkau, sehingga kompiler menolak kesesuaian otomatis.

final class Box { var value = 0 }
struct Wrapper { // not Sendable
    let box: Box // class with mutable state
}

Kelas dan Dapat Dikirim

Kelas adalah tipe referensi, sehingga salinannya berbagi instans yang sama. Sebuah kelas hanya dapat dikirim jika tidak dapat diturunkan dan semua properti tersimpannya tidak berubah serta dapat dikirim.

final class ImmutablePoint: Sendable {
    let x: Double
    let y: Double
    init(x: Double, y: Double) { self.x = x; self.y = y }
}

@unchecked Dapat Dikirim

Terkadang Anda mengetahui bahwa sebuah kelas aman untuk utas karena melindungi keadaannya dengan kunci, tetapi kompiler tidak dapat membuktikannya. Gunakan @unchecked Sendable untuk menyatakan keamanannya secara manual.

Ini adalah jalan keluar: Anda bertanggung jawab atas kebenarannya.

import Foundation
final class Cache: @unchecked Sendable {
    private let lock = NSLock()
    private var storage: [String: Int] = [:]
    func set(_ k: String, _ v: Int) {
        lock.lock(); defer { lock.unlock() }
        storage[k] = v
    }
}

Fungsi Penutupan @Sendable

Fungsi penutupan juga dapat ditandai sebagai @Sendable. Fungsi penutupan semacam ini dapat diteruskan melintasi batas konkurensi, sehingga kompiler memverifikasi bahwa fungsi tersebut hanya menangkap nilai yang dapat dikirim.

func run(_ work: @Sendable () -> Void) {
    work()
}
let name = "Ada" // immutable, Sendable
run { print(name) }

Penangkapan Keadaan Mutable Ditolak

Fungsi penutupan @Sendable tidak dapat menangkap variabel mutable, karena dua tugas dapat mengubahnya secara bersamaan.

Kompiler menandai penangkapan pada kode di bawah ini.

var counter = 0
// Error: @Sendable closure captures mutable var
// run { counter += 1 }

Dapat Dikirim dalam API Asinkron

Titik masuk konkurensi memerlukan Sendable. Fungsi penutupan Task adalah @Sendable, dan nilai yang diteruskan ke aktor lain harus dapat dikirim.

Dengan cara inilah sistem tipe mencegah data yang tidak aman untuk utas bocor di antara tugas.

func process(_ user: User) async {
    Task {
        // user is Sendable, safe to capture
        print(user.name)
    }
}

Batasan Generik untuk Nilai yang Dapat Dikirim

Anda dapat mewajibkan nilai yang dapat dikirim dalam generik. Fungsi yang membuat tugas dengan argumennya harus membatasi argumen tersebut agar memenuhi Sendable.

func dispatch<T: Sendable>(_ value: T) {
    Task { print(value) }
}

Dapat Dikirim vs Aktor

Sendable menjawab "apakah nilai ini aman untuk diteruskan?", sedangkan actor menjawab "bagaimana saya melindungi keadaan mutable?"

Keduanya dapat disusun: aktor secara implisit dapat dikirim karena akses ke keadaannya dibuat berseri.

actor Logger { } // actors are implicitly Sendable

Pemeriksaan Singkat: Dapat Dikirim

Uji pemahaman Anda tentang kesesuaian dengan Sendable.

Ringkasan: Protokol Dapat Dikirim

Sendable menandai tipe yang aman melintasi batas konkurensi. Tipe nilai yang tidak berubah memiliki kesesuaian otomatis; kelas yang tidak dapat diturunkan dan tidak berubah dapat memiliki kesesuaian; kelas yang aman untuk utas menggunakan @unchecked Sendable.

Fungsi penutupan @Sendable hanya boleh menangkap nilai yang dapat dikirim, dan API asinkron memerlukan nilai yang dapat dikirim untuk mencegah berbagi yang tidak aman. Bersama aktor, Sendable membentuk dasar pada tingkat tipe untuk keamanan Swift terhadap perlombaan data.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Protocol Sendable” gratis?

Ya — teks lengkap “Protocol Sendable” 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 4 pelajaran total.

Apa yang akan aku pelajari di “Protocol Sendable”?

Tandai tipe yang aman melintasi ranah konkurensi. 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 2 dari 4.

Berapa lama pelajaran “Protocol Sendable” 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. Masalah Perlombaan Data
  2. Protocol Sendable
  3. Isolasi Actor dan nonisolated
  4. Migrasi ke Konkurensi Ketat
← Kembali ke Swift Academy