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

ส่วนขยายโปรโตคอลกับส่วนขยายชนิด

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

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

ภาพรวม

เป้าหมาย: ทราบว่าเมื่อใดควรใช้ส่วนขยายโพรโทคอล (พฤติกรรมปริยายสำหรับชนิดข้อมูลที่สอดคล้องทั้งหมด) เทียบกับส่วนขยายชนิดข้อมูล (ส่วนเชื่อมต่อโปรแกรมสำหรับชนิดข้อมูลรูปธรรมหนึ่งชนิด) และจะกล่าวถึงกฎการเลือกใช้เมธอดด้วย

โพรโทคอลและการสอดคล้อง

โพรโทคอลประกาศข้อกำหนด ชนิดข้อมูลจะสอดคล้องด้วยการนำข้อกำหนดเหล่านั้นไปใช้งาน

protocol Greeter {
    func greet() -> String
}
struct Person: Greeter {
    var name: String
    func greet() -> String { "Hi, I'm \\(name)" }  // concrete requirement impl
}
print(Person(name: "Ada").greet())

การใช้งานปริยายผ่านส่วนขยายโพรโทคอล

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

protocol Describable {
    func describe() -> String
}
extension Describable {
    // default for ALL conformers until they override
    func describe() -> String { "No description" }
}

struct Car: Describable { }             // uses default
struct Book: Describable {
    func describe() -> String { "A book" } // custom override
}
print(Car().describe(), Book().describe())

ส่วนเชื่อมต่อโปรแกรมจากส่วนขยายชนิดข้อมูล

ส่วนขยายชนิดข้อมูลเพิ่มเมธอดหรือพร็อพเพอร์ตีแบบคำนวณให้กับชนิดข้อมูลรูปธรรมเพียงชนิดเดียว โดยไม่สามารถเพิ่มพร็อพเพอร์ตีแบบเก็บค่าได้

struct Point { var x: Int; var y: Int }

extension Point {
    // add helper just to Point
    var lengthSquared: Int { x*x + y*y }
    func moved(dx: Int, dy: Int) -> Point { Point(x: x+dx, y: y+dy) }
}
let p = Point(x: 2, y: 3)
print(p.lengthSquared, p.moved(dx: 1, dy: -1))

ส่วนขยายแบบมีเงื่อนไข

เพิ่มพฤติกรรมให้ชนิดข้อมูลที่สอดคล้องบางส่วนโดยใช้อนุประโยค where ในส่วนขยายโพรโทคอล

protocol Summable { }
extension Int: Summable { }
extension Array where Element: Summable {
    // only for arrays whose elements conform to Summable
    func joinedCount() -> Int { self.count }
}
print([1,2,3].joinedCount())   // works (Int conforms)
 // print(["a","b"].joinedCount()) // not available

พฤติกรรมการเลือกใช้เมธอด (ภาพรวม)

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

protocol Speaker { func speak() -> String }
extension Speaker { func speak() -> String { "default" } }

struct Cat: Speaker { }
struct Dog: Speaker {
    func speak() -> String { "woof" } // requirement impl overrides default
}

let s1: Speaker = Cat()
let s2: Speaker = Dog()
print(s1.speak()) // "default" (uses default impl)
print(s2.speak()) // "woof" (Dog provides requirement impl)

let c = Cat()
print(c.speak())  // "default" via extension on protocol

ส่วนขยายโพรโทคอลเทียบกับส่วนขยายชนิดข้อมูล

ตรวจสอบอย่างรวดเร็ว: ความแตกต่างสำคัญคืออะไร

สรุปทบทวน

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

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

บทเรียน “ส่วนขยายโปรโตคอลกับส่วนขยายชนิด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ส่วนขยายโปรโตคอลกับส่วนขยายชนิด”

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

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

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

บทเรียน “ส่วนขยายโปรโตคอลกับส่วนขยายชนิด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐานโปรโตคอลและส่วนขยาย
  2. ส่วนขยายโปรโตคอลกับส่วนขยายชนิด
  3. ข้อกำหนดระดับชนิดกับระดับอินสแตนซ์
← กลับไปที่ Swift Academy