Swift Academy · Pelajaran

Protokol Sendable

Tandakan jenis sebagai selamat merentas domain serentak.

Pelajaran 2 daripada 413 langkah

Protokol Sendable ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Maksud Sendable

Sendable ialah protokol penanda. Jenis yang mematuhinya menjamin bahawa jenis tersebut selamat dikongsi merentasi domain konkurensi tanpa memperkenalkan perlumbaan data.

Ia tidak mempunyai kaedah; ia ialah jaminan keselamatan bebenang yang diperiksa oleh pengkompil.

protocol Sendable {}

Jenis Nilai Selalunya Sendable

Struktur dan enumerasi yang semua sifat tersimpannya ialah Sendable boleh mematuhinya secara automatik.

Oleh sebab nilai disalin apabila dihantar, setiap tugas mendapat salinan bebasnya sendiri.

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

Pematuhan Tersirat

Banyak jenis nilai mendapat Sendable secara tersirat: struktur dan enumerasi beku bukan awam dengan ahli Sendable, tupel jenis Sendable dan metajenis.

Anda selalunya tidak perlu menulis : Sendable untuk jenis nilai dalaman.

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

Apabila Struktur BUKAN Sendable

Jika sesuatu struktur menyimpan sifat tersimpan yang bukan Sendable, struktur itu bukan Sendable.

Di sini, rujukan kelas menjadikan keadaan boleh ubah yang dikongsi boleh dicapai, maka pengkompil menolak pematuhan automatik.

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

Kelas dan Sendable

Kelas ialah jenis rujukan, jadi salinan berkongsi contoh yang sama. Kelas hanya boleh mematuhi Sendable jika ia muktamad dan semua sifat tersimpannya tidak boleh ubah serta Sendable.

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

@unchecked Sendable

Kadang-kadang Anda tahu bahawa sesuatu kelas selamat untuk utas (ia melindungi keadaan dengan lock), tetapi pengkompil tidak dapat membuktikannya. Gunakan @unchecked Sendable untuk mengesahkan keselamatan secara manual.

Ini ialah jalan keluar: Anda bertanggungjawab memastikan ketepatannya.

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
    }
}

Penutupan @Sendable

Penutupan juga boleh ditandai sebagai @Sendable. Penutupan sedemikian boleh dihantar merentasi sempadan keserentakan, jadi pengkompil mengesahkan bahawa penutupan itu hanya menangkap nilai Sendable.

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

Penangkapan Keadaan Boleh Ubah Ditolak

Penutupan @Sendable tidak boleh menangkap pemboleh ubah yang boleh diubah, kerana dua tugas mungkin mengubahnya secara serentak.

Pengkompil menandai penangkapan di bawah.

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

Sendable dalam API Tak Segerak

Titik masuk keserentakan memerlukan Sendable. Penutupan Task ialah @Sendable, dan nilai yang dihantar kepada aktor lain mestilah Sendable.

Beginilah sistem jenis menghalang data yang tidak selamat untuk utas daripada tersebar merentasi tugas.

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

Kekangan Sendable Generik

Anda boleh mewajibkan Sendable dalam jenis generik. Sesuatu fungsi yang mencipta tugas menggunakan hujahnya hendaklah mengehadkan hujah itu kepada Sendable.

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

Sendable Berbanding Aktor

Sendable menjawab "adakah nilai ini selamat untuk dihantar?" manakala actor menjawab "bagaimanakah saya melindungi keadaan yang boleh diubah?"

Kedua-duanya boleh digabungkan: aktor secara tersirat ialah Sendable kerana akses kepada keadaannya disiri.

actor Logger { } // actors are implicitly Sendable

Uji Cepat: Sendable

Uji pemahaman Anda tentang pematuhan Sendable.

Ringkasan: Protokol Sendable

Sendable menandai jenis yang selamat merentasi sempadan keserentakan. Jenis nilai yang tidak boleh ubah mematuhi protokol secara automatik; kelas muktamad yang tidak boleh ubah boleh mematuhinya; kelas yang selamat untuk utas menggunakan @unchecked Sendable.

Penutupan @Sendable hanya boleh menangkap nilai Sendable, dan API tak segerak memerlukan Sendable untuk menghalang perkongsian yang tidak selamat. Bersama-sama aktor, Sendable membentuk asas keselamatan perlumbaan data Swift pada peringkat jenis.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Protokol Sendable” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Protokol Sendable”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Protokol Sendable”?

Tandakan jenis sebagai selamat merentas domain serentak. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Protokol Sendable” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Masalah Perlumbaan Data
  2. Protokol Sendable
  3. Pengasingan Actor dan nonisolated
  4. Berpindah kepada Keserentakan Ketat
← Kembali ke Swift Academy