CustomStringConvertible
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 37 من 57.
عند طباعة قيمة، يعرض Swift نوعها وخصائصها افتراضيًا، وبالنسبة إلى الفئة يعرض اسم النوع فقط. يتيح الالتزام بـ CustomStringConvertible وتوفير description التحكم في النص:
struct Money {
let cents: Int
}
struct Price: CustomStringConvertible {
let cents: Int
var description: String { "$\(cents / 100).\(cents % 100)" }
}
print(Money(cents: 1250))
print(Price(cents: 1250))الناتج:
Money(cents: 1250)
$12.50يُستخدم description بواسطة print، وبواسطة استيفاء السلاسل النصية، وبواسطة String(describing:)، لذا تتحكم خاصية واحدة في كل موضع تُعرض فيه القيمة:
struct Point: CustomStringConvertible {
let x: Int, y: Int
var description: String { "(\(x), \(y))" }
}
let p = Point(x: 2, y: 5)
print("start at \(p)")
print([p, Point(x: 0, y: 0)])
print(String(describing: p).count)المخرجات:
start at (2, 5)
[(2, 5), (0, 0)]
6تستفيد الفئات أكثر من ذلك، لأن طباعة مثيل من فئة ما تعرض بخلاف ذلك اسم نوعه فقط:
class Account {
let owner: String
var balance: Int
init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
}
class NamedAccount: CustomStringConvertible {
let owner: String
var balance: Int
init(owner: String, balance: Int) { self.owner = owner; self.balance = balance }
var description: String { "\(owner): \(balance)" }
}
print(Account(owner: "Ada", balance: 5))
print(NamedAccount(owner: "Ada", balance: 5))الناتج:
main.Account
Ada: 5اجعل description قصيرًا وسهل القراءة للأشخاص. فهو غير مخصص للتحليل، ولا ينبغي أن يغيّر القيمة:
enum Status: CustomStringConvertible {
case active, suspended
var description: String {
switch self {
case .active: return "active"
case .suspended: return "suspended"
}
}
}التحدي
سهلاجعل البنية Fraction (البسط، المقام) متوافقة مع CustomStringConvertible. يعرض description الكسر في أبسط صورة: تُطبع 6/8 كـ 3/4، و4/2 كـ 2، و0/5 كـ 0، ويحافظ الكسر السالب على إشارته في المقدمة (-1/2). اكتب دالة مساعدة gcd(_:_:) للاختزال.
يقرأ الكود المُقدَّم الكسور a/b، كسرًا واحدًا في كل سطر، ويطبع كل كسر باستخدام print.
ضع كودك في Fraction.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج المُقدَّم، ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: "/").map { Int($0)! }
print(Fraction(numerator: p[0], denominator: p[1]))
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift