0Pricing
Swift Academy · Ders

Sendable Protokolü

Türleri eşzamanlılık alanları arasında geçiş için güvenli olarak işaretleyin.

Sendable Protokolü, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

Sendable Ne Anlama Gelir

Sendable bir işaretleyici protokoldür. Bu protokole uyan bir tür, veri yarışlarına yol açmadan eşzamanlılık alanları arasında güvenle paylaşılabileceğini taahhüt eder.

Yöntem içermez; iş parçacığı güvenliği hakkında derleyici tarafından denetlenen bir garantidir.

protocol Sendable {}

Değer Türleri Çoğunlukla Sendable'dır

Saklanan özelliklerinin tümü Sendable olan yapılar ve numaralandırmalar otomatik olarak bu protokole uyabilir.

Değerler aktarılırken kopyalandığı için her görev kendi bağımsız kopyasını alır.

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

Örtük Uyum

Birçok değer türü Sendable uyumunu örtük olarak kazanır: Sendable üyeleri olan genel kullanıma açık olmayan dondurulmuş yapılar ve numaralandırmalar, Sendable türlerden oluşan demetler ve metatürler.

İç değer türleri için çoğu zaman hiç : Sendable yazmanız gerekmez.

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

Bir Yapı NOT Sendable

Bir yapı, Sendable olmayan depolanmış bir özellik içeriyorsa gönderilebilir değildir.

Burada sınıf başvurusu, paylaşılan değiştirilebilir duruma erişilebilmesini sağladığından derleyici otomatik uyumluluğu reddeder.

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

Sınıflar ve Gönderilebilirlik

Sınıflar başvuru türleridir; bu nedenle kopyalar aynı örneği paylaşır. Bir sınıf yalnızca son ise ve depolanmış tüm özellikleri değişmez ve gönderilebilir durumdaysa gönderilebilir.

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

@unchecked Gönderilebilirlik

Bazen bir sınıfın iş parçacığı açısından güvenli olduğunu (durumu bir kilitle koruduğunu) bilirsiniz, ancak derleyici bunu kanıtlayamaz. Güvenliği elle bildirmek için @unchecked Sendable kullanın.

Bu bir kaçış yoludur: doğruluktan siz sorumlu olursunuz.

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

@Sendable Kapanımlar

Kapanımlar da @Sendable olarak işaretlenebilir. Böyle bir kapanım eşzamanlılık sınırları arasından geçirilebilir; bu nedenle derleyici yalnızca gönderilebilir değerleri yakaladığını doğrular.

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

Değiştirilebilir Durumu Yakalamak Reddedilir

@Sendable bir kapanım, değiştirilebilir bir değişkeni yakalayamaz; çünkü iki görev bu değişkeni eşzamanlı olarak değiştirebilir.

Derleyici aşağıdaki yakalamayı bildirir.

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

Eşzamansız API'lerde Gönderilebilirlik

Eşzamanlılık giriş noktaları Sendable gerektirir. Task kapanımları @Sendable niteliğindedir ve diğer aktörlere aktarılan değerler gönderilebilir olmalıdır.

Tür sistemi, iş parçacığı açısından güvenli olmayan verilerin görevler arasında sızmasını böyle engeller.

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

Genel Gönderilebilirlik Kısıtlamaları

Genel türlerde gönderilebilirlik gerektirebilirsiniz. Argümanıyla görevler oluşturan bir işlev, bu argümanı Sendable ile kısıtlamalıdır.

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

Gönderilebilirlik ve Aktör

Sendable, "is this value safe to pass?" sorusunu yanıtlarken bir actor, "how do I protect mutable state?" sorusunu yanıtlar.

Birlikte çalışırlar: aktörler, durumlarına erişim serileştirildiği için örtük olarak gönderilebilirdir.

actor Logger { } // actors are implicitly Sendable

Kısa Kontrol: Gönderilebilirlik

Gönderilebilirlik uyumluluğu konusundaki anlayışınızı sınayın.

Özet: Gönderilebilir Protokolü

Sendable, eşzamanlılık sınırlarından geçmesi güvenli olan türleri belirtir. Değişmez değer türleri otomatik olarak uyumludur; son ve değişmez sınıflar uyumlu olabilir; iş parçacığı açısından güvenli sınıflar @unchecked Sendable kullanır.

@Sendable kapanımları yalnızca gönderilebilir değerleri yakalayabilir ve eşzamansız API'ler güvenli olmayan paylaşımı önlemek için gönderilebilirlik gerektirir. Gönderilebilirlik, aktörlerle birlikte Swift'te veri yarışı güvenliğinin tür düzeyindeki temelini oluşturur.

Sıkça Sorulan Sorular

“Sendable Protokolü” dersi ücretsiz mi?

Evet — “Sendable Protokolü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“Sendable Protokolü” dersinde ne öğreneceğim?

Türleri eşzamanlılık alanları arasında geçiş için güvenli olarak işaretleyin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Sendable Protokolü” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Veri Yarışı Sorunu
  2. Sendable Protokolü
  3. Actor Yalıtımı ve nonisolated
  4. Katı Eşzamanlılığa Geçiş
← Swift Academy Sayfasına Dön