การสะท้อนด้วย Mirror
ตรวจสอบคุณสมบัติของค่าใดก็ได้ขณะทำงาน
การสะท้อนด้วย Mirror เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
Mirror คืออะไร
Mirror คือการตรวจสอบโครงสร้างขณะทำงานของ Swift ซึ่งช่วยให้คุณตรวจดูโครงสร้างของค่า คุณสมบัติ และค่าของคุณสมบัติเหล่านั้นได้ โดยไม่ต้องทราบชนิดข้อมูลจริงขณะคอมไพล์
การสร้าง Mirror
ส่งค่าใดก็ได้ให้กับ Mirror(reflecting:):
struct Point { let x: Int; let y: Int }
let m = Mirror(reflecting: Point(x: 1, y: 2))
print(m.children.count) // 2การวนซ้ำสมาชิกย่อย
สมาชิกย่อยแต่ละรายการคือคู่ป้ายกำกับและค่า:
struct User { let name: String; let age: Int }
let m = Mirror(reflecting: User(name: "Ann", age: 30))
for child in m.children {
print("\(child.label ?? "?") = \(child.value)")
}
// name = Ann
// age = 30การสร้างพจนานุกรมจากฟิลด์
การตรวจสอบโครงสร้างสามารถแปลงโครงสร้างให้เป็นพจนานุกรมได้:
struct Config { let host: String; let port: Int }
let m = Mirror(reflecting: Config(host: "x", port: 80))
var dict: [String: Any] = [:]
for c in m.children { if let l = c.label { dict[l] = c.value } }
print(dict["port"]!) // 80displayStyle
Mirror รายงานค่า displayStyle เช่น .struct, .class, .enum, .tuple, .collection และอื่น ๆ เพื่อให้คุณเลือกสาขาตามชนิดของค่าได้
การตรวจสอบรูปแบบการแสดงผล
ตรวจสอบว่าค่าที่กำลังสะท้อนเป็นชนิดใด:
struct S { let a = 1 }
let m = Mirror(reflecting: S())
if m.displayStyle == .struct {
print("it is a struct with \(m.children.count) field(s)")
}
// it is a struct with 1 field(s)การสะท้อนทูเพิล
ทูเพิลจะแสดงองค์ประกอบย่อยตามตำแหน่ง:
let m = Mirror(reflecting: (10, "hi", true))
for c in m.children { print(c.value) }
// 10
// hi
// trueการสะท้อนชนิดแจกแจง
สำหรับกรณีของชนิดแจกแจงที่มีค่าเชื่อมโยง องค์ประกอบย่อยจะเก็บข้อมูลประกอบ:
enum Result2 { case ok(Int); case fail(String) }
let m = Mirror(reflecting: Result2.ok(42))
print(m.children.first?.value ?? "none") // 42ตัวแสดงเขตข้อมูลทั่วไป
การสะท้อนช่วยให้สร้างเครื่องมือที่ไม่ขึ้นกับชนิด:
func dump2(_ value: Any) {
for c in Mirror(reflecting: value).children {
print("\(c.label ?? "_"): \(c.value)")
}
}
struct Car { let make: String; let year: Int }
dump2(Car(make: "Mini", year: 2020))
// make: Mini
// year: 2020ต้นทุนและข้อจำกัดของการสะท้อน
การสะท้อนทำงานช้ากว่าการเข้าถึงโดยตรงและอ่านได้อย่างเดียว — คุณไม่สามารถกำหนดค่าคุณสมบัติผ่านการสะท้อนได้ ใช้สำหรับการแก้จุดบกพร่อง การบันทึก และตัวช่วยจัดลำดับข้อมูล ไม่ใช่เส้นทางการทำงานที่มีการเรียกใช้บ่อย
struct P { let v: Int }
let m = Mirror(reflecting: P(v: 5))
print(m.children.first!.value) // 5 (read only)การแปลงค่าที่สะท้อน
ค่าขององค์ประกอบย่อยมีชนิดเป็น Any ให้แปลงกลับเป็นชนิดจริงเมื่อต้องการ:
struct Box { let count: Int; let label: String }
let m = Mirror(reflecting: Box(count: 3, label: "hi"))
for c in m.children {
if let n = c.value as? Int { print("int: \(n)") }
if let s = c.value as? String { print("str: \(s)") }
}
// int: 3
// str: hiตรวจสอบอย่างรวดเร็ว
การวนซ้ำ Mirror(reflecting: value).children ให้ผลลัพธ์เป็นอะไร?
สรุป
คุณได้เรียนรู้เรื่อง Mirror ดังนี้:
Mirror(reflecting:)ตรวจสอบค่าขณะโปรแกรมทำงานchildrenให้คู่ป้ายกำกับและค่าdisplayStyleบอกว่าค่าเป็นโครงสร้าง / คลาส / ชนิดแจกแจง / ทูเพิล / คอลเลกชัน- อ่านได้อย่างเดียวและทำงานช้ากว่า — เหมาะสำหรับการแก้จุดบกพร่องและการจัดลำดับข้อมูล แต่ไม่เหมาะกับเส้นทางการทำงานที่มีการเรียกใช้บ่อย
ถัดไป: การสร้างชนิดที่เหมาะกับการแก้จุดบกพร่อง
เรียนรู้ Swift ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 122
- บทเรียน
- 409
คำถามที่พบบ่อย
บทเรียน “การสะท้อนด้วย Mirror” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสะท้อนด้วย Mirror” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสะท้อนด้วย Mirror”
ตรวจสอบคุณสมบัติของค่าใดก็ได้ขณะทำงาน คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การสะท้อนด้วย Mirror” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- CustomStringConvertible
- CustomDebugStringConvertible
- การสะท้อนด้วย Mirror
- การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง