0Pricing
Swift Academy · บทเรียน

Sendable และการตรวจสอบความปลอดภัยต่อเธรด

กำกับข้อมูลด้วย Sendable เขียนคลอเชอร์ @Sendable และเลือกระหว่างชนิดค่า actors กับ @unchecked Sendable เพื่อการแบ่งปันข้อมูลอย่างปลอดภัยต่อเธรด

Sendable และการตรวจสอบความปลอดภัยต่อเธรด เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

Sendable คืออะไร

Sendableเป็นวิธีของ Swift ที่ช่วยรับรองว่าข้อมูลปลอดภัยเมื่อส่งต่อระหว่างงานหรือแอกเตอร์ที่ทำงานพร้อมกัน

  • โครงสร้างและชนิดแจกแจงส่วนใหญ่เป็น Sendable โดยอัตโนมัติ
  • คลาสจะไม่เป็น Sendable โดยค่าเริ่มต้น
  • ใช้แอกเตอร์หรือ @unchecked Sendable (พบไม่บ่อย และต้องดูแลความปลอดภัยด้วยตนเอง)

ชนิดค่าใช้งานได้ง่าย

โครงสร้างที่มีสมาชิกเป็น Sendable จะเป็น Sendable การส่งต่อระหว่างงานจึงปลอดภัย

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

คลาส: ใช้แอกเตอร์

แอกเตอร์ทำให้ความหมายแบบอ้างอิงปลอดภัยระหว่างงานด้วยการจัดลำดับการเข้าถึง

// 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.

คลอเชอร์ @Sendable

กำหนดคลอเชอร์เป็น @Sendable เมื่อคลอเชอร์อาจทำงานบนตัวดำเนินการอื่น หลีกเลี่ยงการจับสถานะที่เปลี่ยนแปลงได้และไม่ใช่ 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 (ขั้นสูง)

@unchecked Sendableจะไม่ใช้การตรวจสอบของคอมไพเลอร์ ควรใช้เฉพาะเมื่อมีการประสานงานภายในอย่างเคร่งครัด เช่น ล็อกหรือคิว และใช้เป็นทางเลือกสุดท้าย

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

แนวทางปฏิบัติที่ดีที่สุด

แนวทาง:

  • ควรใช้ชนิดค่า (เข้ากันได้ดีกับ Sendable)
  • ใช้แอกเตอร์สำหรับสถานะที่เปลี่ยนแปลงได้และใช้ร่วมกัน
  • เขียนคลอเชอร์แบบ @Sendable และหลีกเลี่ยงการจับตัวแปรที่เปลี่ยนแปลงได้และไม่ใช่ Sendable
  • ใช้ @unchecked Sendableเฉพาะเมื่อมีการประสานงานอย่างเข้มงวด

ความหมายของ Sendable

ตรวจสอบสั้น ๆ: Sendable รับรองอะไร

สรุปทบทวน

สรุปทบทวน: ใช้ Sendable เพื่อจำลองความปลอดภัยข้ามงาน ควรเลือกใช้ แอกเตอร์ หรือชนิดค่า เขียนคลอสเชอร์แบบ @Sendable และสงวน @unchecked Sendable ไว้ใช้เฉพาะกับส่วนภายในที่ซิงโครไนซ์อย่างดีเท่านั้น

คำถามที่พบบ่อย

บทเรียน “Sendable และการตรวจสอบความปลอดภัยต่อเธรด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Sendable และการตรวจสอบความปลอดภัยต่อเธรด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Sendable และการตรวจสอบความปลอดภัยต่อเธรด”

กำกับข้อมูลด้วย Sendable เขียนคลอเชอร์ @Sendable และเลือกระหว่างชนิดค่า actors กับ @unchecked Sendable เพื่อการแบ่งปันข้อมูลอย่างปลอดภัยต่อเธรด คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “Sendable และการตรวจสอบความปลอดภัยต่อเธรด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. TaskGroup สำหรับการทำงานแบบขนาน
  2. Actors และการแยกข้อมูล, nonisolated
  3. Sendable และการตรวจสอบความปลอดภัยต่อเธรด
← กลับไปที่ Swift Academy