การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด
ทยอยใช้การตรวจสอบการทำงานพร้อมกันของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ปัญหาการแย่งข้อมูล
- โพรโทคอล Sendable
- การแยกส่วนของแอกเตอร์และ nonisolated
- การย้ายไปใช้การทำงานพร้อมกันแบบเข้มงวด