Swift Academy · บทเรียน

การสะท้อนด้วย Mirror

ตรวจสอบคุณสมบัติของค่าใดก็ได้ขณะทำงาน

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

การสะท้อนด้วย 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"]!)  // 80

displayStyle

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. การสะท้อนด้วย Mirror
  4. การสร้างชนิดที่สะดวกต่อการแก้ไขข้อบกพร่อง
← กลับไปที่ Swift Academy