Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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"
        }
    }
}
challenge icon

التحدي

سهل

اجعل البنية 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]))
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift