0Pricing
Swift Academy · درس

‏CustomDebugStringConvertible

وفّر مخرجات تصحيح أخطاء أكثر تفصيلًا.

‏CustomDebugStringConvertible درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

عرض منفصل لتصحيح الأخطاء

يوفّر CustomDebugStringConvertible الخاصية debugDescription — وهي التمثيل الذي تستخدمه debugPrint وأمر LLDB po ومصحح الأخطاء. ويمكن أن تكون أكثر تفصيلًا من 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 لسلسلة نصية يضيف علامات اقتباس، بما يتوافق مع طبيعتها المخصصة للتصحيح:

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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏CustomDebugStringConvertible»؟

وفّر مخرجات تصحيح أخطاء أكثر تفصيلًا. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «‏CustomDebugStringConvertible»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏CustomStringConvertible
  2. ‏CustomDebugStringConvertible
  3. الانعكاس باستخدام Mirror
  4. إنشاء أنواع سهلة التصحيح
← العودة إلى Swift Academy