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

การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด

ทยอยใช้การตรวจสอบการทำงานพร้อมกันของ Swift 6

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

การทำงานพร้อมกันแบบเข้มงวดคืออะไร

การตรวจสอบการทำงานพร้อมกันแบบเข้มงวด ทำให้คอมไพเลอร์วินิจฉัยสภาวะแข่งขันของข้อมูลที่อาจเกิดขึ้นได้ทุกกรณีขณะคอมไพล์

ในโหมดภาษาสวิฟต์ 6 การตรวจสอบนี้เปิดใช้งานเป็นค่าเริ่มต้น ส่วนในโหมดสวิฟต์ 5 คุณเลือกเปิดใช้งานทีละขั้นได้

ระดับการตรวจสอบทั้งสามระดับ

แฟล็ก -strict-concurrency มีสามระดับ ได้แก่ minimal (ค่าเริ่มต้นในสวิฟต์ 5), targeted (ตรวจสอบโค้ดที่ใช้การทำงานพร้อมกันอยู่แล้ว) และ complete (การตรวจสอบเต็มรูปแบบตามแนวทางของสวิฟต์ 6)

// Build settings example
// SWIFT_STRICT_CONCURRENCY = complete

การนำมาใช้ทีละขั้น

แนวทางที่แนะนำคือเลื่อนระดับขึ้นทีละขั้น เริ่มต้นที่ targeted แก้คำเตือน แล้วจึงเปลี่ยนเป็น complete ก่อนเปลี่ยนโหมดภาษาเป็น 6

วิธีนี้ช่วยให้การย้ายระบบบนฐานโค้ดขนาดใหญ่จัดการได้ง่ายขึ้น

// Step 1: targeted
// Step 2: complete (warnings)
// Step 3: Swift 6 mode (errors)

การย้ายระบบทีละมอดูล

การทำงานพร้อมกันแบบเข้มงวดกำหนดแยกกันในแต่ละเป้าหมายการสร้าง คุณสามารถย้ายระบบทีละมอดูล โดยให้มอดูลอื่นยังอยู่ในโหมดสวิฟต์ 5 จนกว่าจะพร้อม

// Package.swift target
// swiftSettings: [.enableExperimentalFeature("StrictConcurrency")]

คำเตือนที่พบบ่อย: การจับค่าที่ส่งต่อไม่ได้

การวินิจฉัยที่พบบ่อยที่สุดคือการจับค่าที่ส่งต่อไม่ได้ใน Task หรือการส่งค่านั้นข้ามขอบเขตของแอกเตอร์

แก้ไขโดยทำให้ชนิดนั้นเป็นค่าที่ส่งต่อได้ หรือคัดลอกเฉพาะข้อมูลที่ส่งต่อได้ออกมา

final class Model { var name = "" }
func start(_ m: Model) {
    // Warning: non-Sendable Model captured by Task
    // Task { print(m.name) }
}

การแก้ไขด้วยชนิดค่า

บ่อยครั้ง วิธีแก้ที่สะอาดที่สุดคือออกแบบข้อมูลให้เป็นชนิดค่าที่ไม่เปลี่ยนแปลง ซึ่งจะส่งต่อได้โดยอัตโนมัติ

struct Model: Sendable { let name: String }
func start(_ m: Model) {
    Task { print(m.name) } // safe now
}

การแก้ไขด้วย @MainActor

ชนิดสำหรับส่วนติดต่อผู้ใช้มักทำให้เกิดคำเตือน เพราะถูกแตะต้องจากงานเบื้องหลัง การกำกับชนิดด้วย @MainActor จะผูกชนิดนั้นไว้กับเธรดหลักและแก้คำเตือนได้

@MainActor
final class ViewModel {
    var items: [String] = []
    func reload() async {
        let fetched = await load()
        items = fetched
    }
}
func load() async -> [String] { [] }

การสอดคล้องกับค่าที่ส่งต่อได้สำหรับชนิดที่มีอยู่

สำหรับชนิดที่คุณควบคุมและปลอดภัยต่อการทำงานพร้อมกันหลายเธรดอยู่แล้ว ให้เพิ่มการสอดคล้องกับ Sendable หรือ @unchecked Sendable อย่างชัดเจนเพื่อปิดคำเตือนอย่างถูกต้อง

import Foundation
final class Counter: @unchecked Sendable {
    private let lock = NSLock()
    private var n = 0
}

การนำเข้าก่อนการทำงานพร้อมกัน

เมื่อส่วนอ้างอิงยังไม่ได้กำกับส่วนติดต่อของตนเองด้วยข้อมูลการทำงานพร้อมกัน @preconcurrency import จะผ่อนปรนการตรวจสอบสำหรับมอดูลนั้น โดยลดข้อผิดพลาดให้เป็นคำเตือนจนกว่าจะมีการอัปเดต

@preconcurrency import SomeLegacyFramework

การกำกับสัญลักษณ์ด้วย @preconcurrency

คุณยังสามารถกำกับการประกาศแต่ละรายการด้วย @preconcurrency เพื่อไม่ให้ผู้เรียกจากโค้ดรุ่นเก่าได้รับข้อผิดพลาดเมื่อคุณเพิ่มข้อกำหนดให้เป็นค่าที่ส่งต่อได้

@preconcurrency
func handle(_ value: Sendable) { }

การตรวจสอบการย้ายระบบ

เมื่อการตรวจสอบระดับ complete ไม่สร้างคำเตือนเลย ให้เปลี่ยนเป้าหมายการสร้างเป็นโหมดสวิฟต์ 6 เพื่อให้ข้อรับประกันกลายเป็นข้อผิดพลาดที่ถูกบังคับใช้และไม่สามารถย้อนกลับมาเกิดปัญหาได้

// Package.swift
// .target(name: "App", swiftSettings: [.swiftLanguageMode(.v6)])

ตรวจสอบความเข้าใจ: การย้ายระบบ

ทดสอบความเข้าใจของคุณเกี่ยวกับการย้ายระบบไปสู่การทำงานพร้อมกันแบบเข้มงวด

สรุป: การย้ายสู่การทำงานพร้อมกันแบบเข้มงวด

การตรวจสอบการทำงานพร้อมกันแบบเข้มงวดย้ายการตรวจจับสภาวะแข่งขันของข้อมูลมาไว้ขณะคอมไพล์ โดยมีระดับ minimal, targeted และ complete ให้ย้ายระบบทีละมอดูล แก้การจับค่าที่ส่งต่อไม่ได้ด้วยชนิดค่า @MainActor หรือการสอดคล้องกับค่าที่ส่งต่อได้อย่างถูกต้อง และใช้ @preconcurrency เพื่ออำนวยความสะดวกในการทำงานร่วมกับส่วนอ้างอิงที่ยังไม่ได้ย้ายระบบ

เมื่อ complete ไม่มีคำเตือนแล้ว ให้เปิดใช้งานโหมดสวิฟต์ 6 เพื่อยืนยันข้อรับประกันเหล่านั้น

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

บทเรียน “การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด”

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

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

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

บทเรียน “การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ปัญหาการแย่งข้อมูล
  2. โพรโทคอล Sendable
  3. การแยกส่วนของแอกเตอร์และ nonisolated
  4. การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด
← กลับไปที่ Swift Academy