Swift Academy · บทเรียน

ชนิดที่เชื่อมโยงหลักและการโยนข้อผิดพลาดที่มีชนิด

จำกัดชนิดดำรงอยู่ของโพรโทคอล และส่งต่อข้อผิดพลาดที่มีชนิดใน Swift 6

บทเรียน 4 จาก 413 ขั้นตอน

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

ชนิดที่เกี่ยวข้องหลัก

Swift 5.7 ให้คุณระบุชนิดที่เกี่ยวข้องหลักในโพรโทคอลได้ ทำให้สามารถใช้ชนิดอัตถิภาวะที่มีข้อจำกัดได้

protocol Container<Element> {
  associatedtype Element
  var items: [Element] { get }
}
struct Bag<T>: Container { var items: [T] = [] }

ชนิดอัตถิภาวะที่มีข้อจำกัด

เมื่อมีชนิดที่เกี่ยวข้องหลัก คุณสามารถเขียน any Container เพื่อจำกัดชนิดอัตถิภาวะให้แคบลงได้

func printItems(_ c: any Container<Int>) {
  c.items.forEach { print($0) }
}
printItems(Bag(items: [1,2,3]))

ชนิดอัตถิภาวะของคอลเลกชันที่มีข้อจำกัด

โพรโทคอลในไลบรารีมาตรฐาน เช่น Collection รองรับชนิดที่เกี่ยวข้องหลักแล้ว

func first(_ c: any Collection<String>) -> String? {
  c.first
}
print(first(["a","b","c"]) ?? "none")

บทนำสู่การโยนข้อผิดพลาดแบบระบุชนิด

Swift 6 นำเสนอการโยนข้อผิดพลาดแบบระบุชนิด ทำให้คุณประกาศชนิดข้อผิดพลาดที่แน่นอนซึ่งฟังก์ชันอาจโยนได้

enum NetworkError: Error { case timeout, notFound }
func fetch() throws(NetworkError) -> Data {
  throw NetworkError.timeout
}

การดักจับข้อผิดพลาดแบบครอบคลุมด้วยการโยนข้อผิดพลาดแบบระบุชนิด

เนื่องจากทราบชนิดข้อผิดพลาดแล้ว คอมไพเลอร์จึงตรวจสอบได้ว่ามีการจัดการทุกกรณีอย่างครบถ้วน

do {
  let _ = try fetch()
} catch .timeout {
  print("Timed out")
} catch .notFound {
  print("Not found")
}

การโยนข้อผิดพลาดแบบระบุชนิดในโพรโทคอล

ข้อกำหนดของโพรโทคอลสามารถระบุการโยนข้อผิดพลาดแบบมีชนิดได้ ทำให้ชนิดที่สอดคล้องกันสามารถระบุชนิดข้อผิดพลาดได้อย่างแม่นยำ

protocol Fetchable {
  associatedtype Failure: Error
  func fetch() throws(Failure) -> Data
}

การโยนข้อผิดพลาดต่อด้วยการโยนข้อผิดพลาดแบบระบุชนิด

rethrows ทำงานร่วมกับการโยนข้อผิดพลาดแบบระบุชนิดได้ โดยฟังก์ชันภายนอกจะส่งต่อชนิดข้อผิดพลาดจากฟังก์ชันภายใน

func map<T, E: Error>(_ array: [T], transform: (T) throws(E) -> T) throws(E) -> [T] {
  try array.map { try transform($0) }
}

การใช้ชนิดที่เกี่ยวข้องหลักร่วมกับการโยนข้อผิดพลาดแบบระบุชนิด

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

protocol Repository<Model> {
  associatedtype Model
  associatedtype Failure: Error
  func fetchAll() throws(Failure) -> [Model]
}

การโยนข้อผิดพลาดแบบระบุชนิดที่ไม่เปิดเผย

throws(any Error) เทียบเท่ากับการโยนข้อผิดพลาดที่ไม่ระบุชนิด และเปิดทางเลือกสำหรับกรณีที่ต้องการความยืดหยุ่น

func riskyOp() throws(any Error) {
  // can throw any error
}

การย้ายจากการโยนข้อผิดพลาดที่ไม่ระบุชนิดเป็นแบบระบุชนิด

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

// Before:
func load() throws -> Data { ... }
// After:
func load() throws(NetworkError) -> Data { ... }

การโยนข้อผิดพลาดแบบระบุชนิดและการทำงานแบบอะซิงก์

การโยนข้อผิดพลาดแบบระบุชนิดทำงานร่วมกับการทำงานแบบอะซิงก์ได้อย่างเป็นธรรมชาติ โดย async throws(E) เป็นไวยากรณ์ที่ถูกต้อง

func fetchAsync() async throws(NetworkError) -> Data {
  throw NetworkError.notFound
}

ตรวจสอบความเข้าใจ

การมีชนิดที่เกี่ยวข้องหลักในโพรโทคอลทำให้เกิดความสามารถใด

ทบทวนบทเรียน

ชนิดที่เกี่ยวข้องหลัก (Swift 5.7) ทำให้ใช้ชนิดอัตถิภาวะที่มีข้อจำกัด เช่น any Collection ได้ การโยนข้อผิดพลาดแบบระบุชนิด (Swift 6) ช่วยให้ประกาศชนิดข้อผิดพลาดที่แน่นอนสำหรับบล็อกการดักจับข้อผิดพลาดแบบครอบคลุมได้ ความสามารถทั้งสองอย่างช่วยเพิ่มความปลอดภัยของชนิดข้อมูลและความสื่อความหมายของเอพีไอ

เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “ชนิดที่เชื่อมโยงหลักและการโยนข้อผิดพลาดที่มีชนิด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ชนิดที่เชื่อมโยงหลักและการโยนข้อผิดพลาดที่มีชนิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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. ข้อจำกัดของชนิดทั่วไปและส่วนคำสั่ง where
  2. ชนิดทึบแสงด้วยคีย์เวิร์ด some
  3. ชนิดดำรงอยู่ด้วย any และการลบชนิด
  4. ชนิดที่เชื่อมโยงหลักและการโยนข้อผิดพลาดที่มีชนิด
← กลับไปที่ Swift Academy