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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- CustomStringConvertible
- CustomDebugStringConvertible
- الانعكاس باستخدام Mirror
- إنشاء أنواع سهلة التصحيح