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