การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง
ผสานคำอธิบายกับการสะท้อนอย่างมีประสิทธิภาพ
การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
การผสานเครื่องมือ
ชนิดที่ดีที่สุดคือชนิดที่ตรวจสอบได้ง่าย ให้ผสาน CustomStringConvertible, CustomDebugStringConvertible และ Mirror เพื่อสร้างค่าที่แสดงผลได้ชัดเจนและเปิดเผยโครงสร้างภายในได้เมื่อต้องการ
description ที่กระชับ
เริ่มจากผลลัพธ์ที่ผู้ใช้มองเห็น:
struct Vector: CustomStringConvertible {
let x: Double
let y: Double
var description: String { "(\(x), \(y))" }
}
print(Vector(x: 1, y: 2)) // (1.0, 2.0)เพิ่ม debugDescription สำหรับการวินิจฉัย
เพิ่มรายละเอียดสำหรับการแก้จุดบกพร่อง:
struct Vector: CustomStringConvertible, CustomDebugStringConvertible {
let x: Double
let y: Double
var description: String { "(\(x), \(y))" }
var debugDescription: String { "Vector(x: \(x), y: \(y), len: \(length))" }
var length: Double { (x * x + y * y).squareRoot() }
}
debugPrint(Vector(x: 3, y: 4)) // Vector(x: 3.0, y: 4.0, len: 5.0)สร้าง description อัตโนมัติด้วยการสะท้อน
ใช้การสะท้อนเพื่อสร้าง description โดยไม่ต้องระบุเขตข้อมูลทุกรายการด้วยตนเอง:
struct Auto: CustomStringConvertible {
let a = 1
let b = "x"
var description: String {
let fields = Mirror(reflecting: self).children
.map { "\($0.label ?? "_")=\($0.value)" }
.joined(separator: ", ")
return "Auto(\(fields))"
}
}
print(Auto()) // Auto(a=1, b=x)ตัวช่วยการสะท้อนที่นำกลับมาใช้ได้
แยกตรรกะของ Mirror ออกมาเป็นฟังก์ชันอิสระ เพื่อให้ชนิดต่าง ๆ ใช้ตัวจัดรูปแบบการแก้จุดบกพร่องร่วมกันได้
ตัวช่วยสร้างคำอธิบายที่ใช้ร่วมกัน
ตัวช่วยเดียวที่นำกลับมาใช้ได้ทุกที่:
func reflectiveDescription(_ value: Any) -> String {
let name = String(describing: type(of: value))
let parts = Mirror(reflecting: value).children
.map { "\($0.label ?? "_"): \($0.value)" }
.joined(separator: ", ")
return "\(name)(\(parts))"
}
struct P { let id = 7; let tag = "z" }
print(reflectiveDescription(P())) // P(id: 7, tag: z)การใช้งานค่าเริ่มต้นของโพรโทคอล
มอบความสามารถในการแก้จุดบกพร่องด้วยการสะท้อนให้ชนิดทั้งกลุ่มผ่านส่วนขยายโพรโทคอล:
protocol Inspectable: CustomStringConvertible {}
extension Inspectable {
var description: String {
let parts = Mirror(reflecting: self).children
.map { "\($0.label ?? "_")=\($0.value)" }
.joined(separator: ", ")
return "\(type(of: self))[\(parts)]"
}
}
struct Widget: Inspectable { let w = 10; let h = 20 }
print(Widget()) // Widget[w=10, h=20]การแสดงค่าซ้อนกันอย่างสวยงาม
การสะท้อนจะทำงานแบบเรียกซ้ำตามธรรมชาติเมื่อองค์ประกอบย่อยเป็นค่าที่แสดงผลได้ด้วยตนเอง:
struct Inner: CustomStringConvertible { let v = 1; var description: String { "Inner(\(v))" } }
struct Outer: CustomStringConvertible {
let inner = Inner()
var description: String { "Outer(\(inner))" }
}
print(Outer()) // Outer(Inner(1))การใช้ตัวแสดงโครงสร้างของ Swift
dump ที่มีมาให้ในตัวใช้ Mirror เพื่อแสดงต้นไม้เชิงลึกที่เยื้องระดับ — มีประโยชน์สำหรับการตรวจสอบอย่างรวดเร็ว:
struct Node { let id = 1; let kids = [2, 3] }
dump(Node())
// - id: 1
// - kids: 2 elements ...การประกอบทุกอย่างเข้าด้วยกัน
ชนิดที่ขัดเกลาแล้ว: description ที่กระชับ ข้อมูลการแก้จุดบกพร่องที่ละเอียด และทางเลือกสำรองด้วยการสะท้อน — บันทึกได้ง่ายและแก้จุดบกพร่องได้ง่าย
struct Order: CustomStringConvertible, CustomDebugStringConvertible {
let id: Int
let total: Double
var description: String { "Order #\(id)" }
var debugDescription: String { "Order(id: \(id), total: \(total))" }
}
let o = Order(id: 5, total: 9.99)
print(o) // Order #5
debugPrint(o) // Order(id: 5, total: 9.99)การนับเขตข้อมูลด้วยการสะท้อน
การสะท้อนยังมีประโยชน์สำหรับการตรวจสอบโครงสร้างอย่างรวดเร็ว เช่น การนับคุณสมบัติ:
struct Profile { let name = "A"; let age = 1; let city = "X" }
let fieldCount = Mirror(reflecting: Profile()).children.count
print("Profile has \(fieldCount) fields") // Profile has 3 fieldsตรวจสอบอย่างรวดเร็ว
คุณจะสร้าง description โดยไม่ต้องระบุคุณสมบัติทุกรายการด้วยตนเองได้อย่างไร?
สรุป
คุณได้เรียนรู้การสร้างชนิดที่เหมาะกับการแก้จุดบกพร่องดังนี้:
- ผสาน
description(กระชับ) และdebugDescription(ละเอียด) - ใช้
Mirrorเพื่อสร้าง description จากองค์ประกอบย่อยโดยอัตโนมัติ - แยกการสะท้อนออกมาเป็นตัวช่วยหรือการใช้งานค่าเริ่มต้นของโพรโทคอล
dumpแสดงต้นไม้ที่สะท้อนแบบเชิงลึกเพื่อการตรวจสอบอย่างรวดเร็ว
จบบทเรียนแล้ว!
คำถามที่พบบ่อย
บทเรียน “การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง”
ผสานคำอธิบายกับการสะท้อนอย่างมีประสิทธิภาพ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- CustomStringConvertible
- CustomDebugStringConvertible
- การสะท้อนด้วย Mirror
- การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง