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

การออกแบบ API ตามความหมายของค่า

เลือกใช้ struct หรือ class เมื่อออกแบบอินเทอร์เฟซสาธารณะและเฟรมเวิร์ก

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

ยินดีต้อนรับ

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

สัญญาความหมายแบบค่า

ประเภทหนึ่งจะมีความหมายแบบค่าหาก: • สำเนาอิสระสองชุดยังคงเป็นอิสระต่อกันตลอดไป • การเปลี่ยนแปลงสำเนาชุดหนึ่งไม่ส่งผลต่ออีกชุดหนึ่ง • ประเภทนั้นทำงานเหมือน `Int` — `a = b; a += 1` จะไม่ทำให้ `b` เปลี่ยนแปลง

API สาธารณะ: ควรใช้ประเภทค่าที่ส่งคืน

```swift // Reference semantics — caller shares state: func getUser() -> UserClass { ... } // Value semantics — caller gets independent copy: func getUser() -> UserStruct { ... } ``` ประเภทค่าที่ส่งคืนช่วยปกป้องสถานะภายในจากการเปลี่ยนแปลงภายนอก

ประเภทอ้างอิงที่ไม่เปลี่ยนแปลง

เมื่อคลาสไม่เปลี่ยนแปลงอยู่เสมอ คลาสนั้นจะมีพฤติกรรมคล้ายประเภทค่า: ```swift final class Token { let value: String init(_ v: String) { value = v } // No mutable state — safe to share freely } ```

รายการตรวจสอบการเลือกสตรักต์แทนคลาส

ควรเลือกสตรักต์เมื่อ: ✓ ประเภทนั้นจำลองข้อมูล ไม่ใช่เอกลักษณ์ ✓ ไม่จำเป็นต้องสืบทอด ✓ ไม่ควรใช้อินสแตนซ์ร่วมกันหรือเกิดการใช้อ้างอิงร่วม ✓ เปรียบเทียบความเท่ากันได้ด้วยค่าของฟิลด์ ✓ ทำงานร่วมกับ Swift Concurrency ได้ดี (`Sendable`)

Sendable และความหมายแบบค่า

Swift 6 Concurrency กำหนดให้ประเภทที่ข้ามขอบเขตของแอ็กเตอร์ต้องเป็น `Sendable`: ```swift struct Message: Sendable { var text: String; var timestamp: Date } // Safe to pass between actors ``` ประเภทค่าที่มีคุณสมบัติทั้งหมดเป็น Sendable จะเป็น `Sendable` โดยอัตโนมัติ

การทำให้ API ของคลาสปลอดภัยตามความหมายแบบค่า

```swift struct Config { // Expose value snapshot instead of the class: func snapshot() -> Config { self } // copy by value semantics } // Or use a value-type DTO: struct UserDTO: Sendable { var id: UUID; var name: String } ```

รูปแบบตัวสร้างด้วยประเภทค่า

```swift struct Request { var url: URL var method: String = "GET" var headers: [String:String] = [:] func adding(header: String, value: String) -> Request { var copy = self copy.headers[header] = value return copy } } let r = Request(url: url).adding(header: "Auth", value: "Bearer x") ```

สัญญาณในเอกสาร API

การเลือกสตรักต์แทนคลาสจะสื่อสารกับผู้ใช้ API อย่างชัดเจนว่า: • “นี่คือข้อมูล — คัดลอกได้อย่างอิสระ” • “การเปลี่ยนแปลงสำเนาของคุณจะไม่ส่งผลต่อสำเนาของฉัน” • “สามารถส่งต่อสิ่งนี้ระหว่างเธรดได้อย่างปลอดภัย” สิ่งนี้ช่วยลดความจำเป็นในการสร้างสำเนาป้องกันในโค้ดของผู้ใช้

เมื่อใดควรยอมรับความหมายแบบอ้างอิง

ควรยอมรับความหมายแบบคลาสหรือแบบอ้างอิงเมื่อ: • เอกลักษณ์มีความสำคัญ (`===`): วัตถุ `User` สองชิ้นอาจแทนบุคคลคนเดียวกัน • สถานะที่เปลี่ยนแปลงได้ร่วมกันเป็นคุณสมบัติที่ต้องการ: `Database`, `Cache`, `AudioEngine` • ต้องทำงานร่วมกับ ObjC: ประเภท UIKit และ AppKit เป็นคลาส • ต้องมีการเรียกกลับตามวงจรชีวิต: `deinit` สำหรับล้างทรัพยากร

ตรวจสอบอย่างรวดเร็ว

คีย์เวิร์ดใดของ Swift ที่ระบุว่าประเภทหนึ่งปลอดภัยสำหรับการส่งข้ามขอบเขตของแอ็กเตอร์ใน Swift Concurrency

สรุปทบทวน

ประเด็นสำคัญ: • ความหมายแบบค่า: การเปลี่ยนแปลงเกิดขึ้นเฉพาะที่ จึงไม่มีการใช้อ้างอิงร่วม • ควรใช้สตรักต์สำหรับแบบจำลองข้อมูล และใช้คลาสสำหรับเอกลักษณ์หรือวงจรชีวิต • คลาสที่ไม่เปลี่ยนแปลงจะทำงานเหมือนประเภทค่า • `Sendable` + ประเภทค่า = การทำงานหลายเธรดที่ปลอดภัย • รูปแบบตัวสร้างที่ใช้การคัดลอกสตรักต์จะสร้าง API ที่ไม่เปลี่ยนแปลงและสะอาด จบหลักสูตรแล้ว! ถัดไป: ARC และรูปแบบการจัดการหน่วยความจำ

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

บทเรียน “การออกแบบ API ตามความหมายของค่า” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การออกแบบ API ตามความหมายของค่า”

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

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

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

บทเรียน “การออกแบบ API ตามความหมายของค่า” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สแตกกับฮีป: ค่าต่าง ๆ อยู่ที่ใด
  2. การเปลี่ยนแปลง การใช้ร่วมกัน และการอ้างชื่อที่ไม่คาดคิด
  3. กราฟที่มีทั้งค่าและการอ้างอิง
  4. การออกแบบ API ตามความหมายของค่า
← กลับไปที่ Swift Academy