Swift Academy · บทเรียน

การใช้งานเริ่มต้นในส่วนขยาย

จัดเตรียมพฤติกรรมร่วมผ่านส่วนขยายโพรโทคอล

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

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

ปัญหา

โปรโตคอลประกาศข้อกำหนดแต่ไม่มีพฤติกรรม หากชนิดทุกชนิดที่ทำตามโปรโตคอลต้องเขียนตรรกะเดียวกันซ้ำ คุณก็จะมีโค้ดซ้ำซ้อน ส่วนขยายโปรโตคอลแก้ปัญหานี้ด้วยการจัดเตรียมการนำไปใช้เริ่มต้น

protocol Greeter {
    func greet() -> String
}

การเพิ่มค่าเริ่มต้น

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

protocol Greeter { func greet() -> String }

extension Greeter {
    func greet() -> String { "Hello!" }
}

struct Robot: Greeter {}
print(Robot().greet())

การเขียนทับค่าเริ่มต้น

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

protocol Greeter { func greet() -> String }
extension Greeter { func greet() -> String { "Hello!" } }

struct French: Greeter {
    func greet() -> String { "Bonjour!" }
}
print(French().greet())

การเพิ่มเมธอดพิเศษ

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

protocol Named { var name: String { get } }

extension Named {
    func loudName() -> String { name.uppercased() }
}

struct City: Named { let name: String }
print(City(name: "paris").loudName())

คุณสมบัติที่คำนวณค่าเริ่มต้น

ส่วนขยายยังสามารถจัดเตรียมคุณสมบัติที่คำนวณค่าเป็นค่าเริ่มต้นได้ด้วย

protocol Sized {
    var width: Double { get }
    var height: Double { get }
}

extension Sized {
    var area: Double { width * height }
}

struct Rect: Sized { let width: Double; let height: Double }
print(Rect(width: 2, height: 5).area)

การต่อยอดจากข้อกำหนด

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

protocol Summable {
    var values: [Int] { get }
}

extension Summable {
    var total: Int { values.reduce(0, +) }
}

struct Cart: Summable { let values: [Int] }
print(Cart(values: [10, 20, 30]).total)

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

ใช้ส่วนคำสั่ง where เพื่อให้ค่าเริ่มต้นมีผลเฉพาะเมื่อเงื่อนไขเพิ่มเติมเป็นจริง ในที่นี้ค่าเริ่มต้นจะมีอยู่เฉพาะเมื่อ Self เป็น Equatable ด้วย

protocol Container {
    associatedtype Item
    var items: [Item] { get }
}

extension Container where Item: Equatable {
    func contains(_ x: Item) -> Bool { items.contains(x) }
}

struct Bag: Container { let items: [Int] }
print(Bag(items: [1, 2, 3]).contains(2))

ค่าเริ่มต้นและข้อกำหนดร่วมกัน

คุณสามารถประกาศเมธอดในโปรโตคอล AND จัดเตรียมค่าเริ่มต้นได้ การระบุเมธอดไว้ในโปรโตคอลจะเปิดใช้การส่งต่อแบบไดนามิกผ่านชนิดโปรโตคอล

protocol Logger {
    func log() -> String
}
extension Logger {
    func log() -> String { "default log" }
}

struct A: Logger {}
struct B: Logger { func log() -> String { "B log" } }

let loggers: [Logger] = [A(), B()]
for l in loggers { print(l.log()) }

ข้อควรระวังของการส่งต่อแบบสแตติก

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

protocol P {}
extension P { func who() -> String { "P-default" } }
struct Q: P { func who() -> String { "Q" } }

let direct = Q()
let asP: P = Q()
print(direct.who())
print(asP.who())

การลดโค้ดซ้ำซ้อน

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

protocol Identifiable { var id: Int { get } }
extension Identifiable {
    var tag: String { "ID-" + String(id) }
}
struct Order: Identifiable { let id: Int }
print(Order(id: 7).tag)

การรวมส่วนขยายหลายรายการ

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

protocol Money { var cents: Int { get } }
extension Money { var dollars: Double { Double(cents) / 100 } }
extension Money { var label: String { "$" + String(format: "%.2f", dollars) } }

struct Price: Money { let cents: Int }
print(Price(cents: 1299).label)

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

ทดสอบความเข้าใจเกี่ยวกับค่าเริ่มต้นของส่วนขยายโปรโตคอล

สรุปทบทวน

ส่วนขยายโปรโตคอลจัดเตรียมการนำไปใช้เริ่มต้น ทำให้ชนิดที่ทำตามโปรโตคอลสืบทอดพฤติกรรมที่ใช้ร่วมกันและเขียนทับได้เมื่อจำเป็น คุณสามารถเพิ่มเมธอดพิเศษและคุณสมบัติที่คำนวณค่า กำหนดเงื่อนไขให้ค่าเริ่มต้นด้วย where และได้เห็นกฎการส่งต่อแบบสแตติกกับไดนามิกแล้วว่า ให้ประกาศเมธอดในโปรโตคอลเพื่อใช้การส่งต่อแบบไดนามิก

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

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

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

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

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

บทเรียน “การใช้งานเริ่มต้นในส่วนขยาย” ฟรีหรือไม่

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

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

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

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

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

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

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

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

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

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

  1. โพรโทคอลในฐานะสัญญา
  2. การใช้งานเริ่มต้นในส่วนขยาย
  3. การประกอบโพรโทคอล
  4. การสอดคล้องตามเงื่อนไข
← กลับไปที่ Swift Academy