0Pricing
Swift Academy · บทเรียน

CustomDebugStringConvertible

จัดเตรียมผลลัพธ์การแก้ไขข้อบกพร่องที่ละเอียดขึ้น

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

มุมมองการแก้จุดบกพร่องแยกต่างหาก

CustomDebugStringConvertible มี debugDescription ซึ่งเป็นรูปแบบที่ debugPrint, คำสั่ง po ของ LLDB และเครื่องมือแก้จุดบกพร่องใช้ รูปแบบนี้อาจมีรายละเอียดมากกว่า description

การเพิ่ม debugDescription

ทำให้สอดคล้องกับโปรโตคอลและกำหนดคุณสมบัตินี้:

struct Point: CustomDebugStringConvertible {
    let x: Int
    let y: Int
    var debugDescription: String { "Point(x: \(x), y: \(y))" }
}
debugPrint(Point(x: 1, y: 2))  // Point(x: 1, y: 2)

debugPrint กับ print

print ใช้ description ส่วน debugPrint ใช้ debugDescription:

struct Money: CustomStringConvertible, CustomDebugStringConvertible {
    let cents: Int
    var description: String { "$\(Double(cents)/100)" }
    var debugDescription: String { "Money(cents: \(cents))" }
}
let m = Money(cents: 250)
print(m)       // $2.5
debugPrint(m)  // Money(cents: 250)

เมื่อใดควรกำหนดทั้งสองอย่าง

ใช้ description สำหรับผลลัพธ์ที่สะอาดและแสดงต่อผู้ใช้ และใช้ debugDescription สำหรับรายละเอียดเพื่อการวินิจฉัย (ค่าดิบและสถานะภายใน) การกำหนดทั้งสองอย่างช่วยให้เหมาะสมกับแต่ละบริบทที่สุด

รายละเอียดเพิ่มเติมในการแก้จุดบกพร่อง

แสดงข้อมูลภายในที่ผู้ใช้ไม่ควรเห็น:

struct Session: CustomStringConvertible, CustomDebugStringConvertible {
    let user: String
    let token: String
    var description: String { "Session(\(user))" }
    var debugDescription: String { "Session(user: \(user), token: \(token))" }
}
let s = Session(user: "ann", token: "xyz")
print(s)       // Session(ann)
debugPrint(s)  // Session(user: ann, token: xyz)

ผลลัพธ์การแก้จุดบกพร่องในคอลเลกชัน

debugPrint ของคอลเลกชันจะใช้ debugDescription ของสมาชิกแต่ละรายการ:

struct Tag: CustomDebugStringConvertible {
    let name: String
    var debugDescription: String { "Tag(\(name))" }
}
debugPrint([Tag(name: "a"), Tag(name: "b")])  // [Tag(a), Tag(b)]

String(reflecting:)

เช่นเดียวกับที่ String(describing:) ใช้ description, String(reflecting:) ก็ใช้ debugDescription:

struct Code: CustomDebugStringConvertible {
    let n: Int
    var debugDescription: String { "Code<\(n)>" }
}
print(String(reflecting: Code(n: 7)))  // Code<7>

ลักษณะการทำงานสำรอง

หากชนิดข้อมูลมีเพียง description, debugPrint จะใช้คุณสมบัตินี้เป็นทางเลือกสำรอง หากมีเพียง debugDescription, print แบบปกติยังคงใช้รูปแบบมิเรอร์เริ่มต้น:

struct Only: CustomStringConvertible {
    let v: Int
    var description: String { "Only(\(v))" }
}
debugPrint(Only(v: 3))  // Only(3)  -- falls back to description

การใส่เครื่องหมายคำพูดในผลลัพธ์การแก้จุดบกพร่อง

โปรดสังเกตว่า debugPrint ของ String จะเพิ่มเครื่องหมายคำพูด เนื่องจากเป็นลักษณะของผลลัพธ์เพื่อการแก้จุดบกพร่อง:

print("hi")        // hi
debugPrint("hi")   // "hi"

ข้อมูลวินิจฉัยโดยไม่เปิดเผยความลับ

อย่าใส่ข้อมูลลับไว้ใน description แต่จะใส่ไว้ใน debugDescription ได้ก็ต่อเมื่อบันทึกการทำงานมีความปลอดภัย ควรเลือกอย่างรอบคอบว่าแต่ละคุณสมบัติจะแสดงข้อมูลใด

struct Key: CustomStringConvertible {
    let secret: String
    var description: String { "Key(***)" }
}
print(Key(secret: "abc"))  // Key(***)

รายละเอียดการแก้จุดบกพร่องสำหรับอีนัม

อีนัมจะได้ประโยชน์จาก debugDescription ที่แสดงเคสและข้อมูลที่แนบมาแบบดิบ:

enum Load: CustomDebugStringConvertible {
    case idle
    case progress(Int)
    var debugDescription: String {
        switch self {
        case .idle: return "Load.idle"
        case .progress(let p): return "Load.progress(\(p))"
        }
    }
}
debugPrint(Load.progress(40))  // Load.progress(40)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ฟังก์ชันใดใช้ debugDescription แทน description?

สรุป

คุณได้เรียนรู้เกี่ยวกับ CustomDebugStringConvertible:

  • กำหนด var debugDescription: String สำหรับผลลัพธ์เพื่อการวินิจฉัย
  • ใช้โดย debugPrint, String(reflecting:) และเครื่องมือแก้จุดบกพร่อง
  • print ใช้ description ส่วน debugPrint ใช้ debugDescription
  • ใส่รายละเอียดภายในเพิ่มเติมไว้ในผลลัพธ์การแก้จุดบกพร่อง และใส่ข้อความที่สะอาดไว้ใน description

ถัดไป: การตรวจสอบด้วย Mirror

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

บทเรียน “CustomDebugStringConvertible” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “CustomDebugStringConvertible”

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

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

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

บทเรียน “CustomDebugStringConvertible” ใช้เวลานานแค่ไหน

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

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

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

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

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