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

الأعضاء الثابتة

جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 14 من 57.

تنتمي الخاصية static إلى النوع نفسه، وليس إلى أي مثيل. توجد نسخة واحدة بالضبط، ويتم الوصول إليها من خلال اسم النوع:

struct Temperature {
    static let freezing = 0.0
    static let boiling = 100.0
    var celsius: Double
}

print(Temperature.boiling - Temperature.freezing)

الناتج:

100.0

يمكن لـ static var أن تتغير، مما يجعلها مفيدة للبيانات المشتركة بين جميع النسخ، مثل عدّاد لعدد النسخ التي تم إنشاؤها:

class Ticket {
    static var issued = 0
    let number: Int

    init() {
        Ticket.issued += 1
        number = Ticket.issued
    }
}

let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)

الناتج:

1
2
2

يتم استدعاء static func على النوع. لا يملك مثيل self للعمل معه، لذا فهو يستخدم وسائطه والأعضاء الثابتة الأخرى فقط. ويُعدّ مكانًا مناسبًا للدوال المساعدة وللطرق المسمّاة لإنشاء المثيلات:

struct Color {
    var red: Int
    var green: Int
    var blue: Int

    static func gray(_ level: Int) -> Color {
        Color(red: level, green: level, blue: level)
    }
}

let c = Color.gray(128)
print(c.red + c.green + c.blue)

الناتج:

384

داخل النوع، Self هي طريقة أخرى لتسمية النوع، لذا يمكن كتابة الأعضاء الساكنة بصيغة Self.issued. يمكن لأساليب النسخة قراءة الأعضاء الساكنة، لكن لا يمكن لأسلوب ساكن قراءة خصائص النسخة، لأنه لا يُستدعى على نسخة.

struct Level {
    static let maximum = 10
    var current = 1
    func isMax() -> Bool { current == Self.maximum }   // المثيل يقرأ الثابت
    static func describe() -> String { "levels 1-\(maximum)" } // الثابت يقرأ الثابت
}
challenge icon

التحدي

سهل

أكمل الصنف Order. تبدأ الخاصية الساكنة nextId بالقيمة 1، ويأخذ كل طلب جديد قيمة nextId الحالية بوصفها id الخاص به ثم يزيدها. الثابت الساكن taxPercent قيمته 10. تُرجع طريقة النسخة total() المجموع الفرعي مضافًا إليه الضريبة (مع التقريب إلى أسفل)، وتتلقى الطريقة الساكنة summary(of:) مصفوفة من الطلبات وتُرجع 3 orders, 660 total.

يقرأ الكود الموفَّر مجموعًا فرعيًا واحدًا في كل سطر، وينشئ طلبًا لكل منها، ويطبع #1: 110 لكل طلب، ثم يطبع الملخص في النهاية.

ضع كودك في Order.swift. يحتوي main.swift على كود الإدخال/الإخراج الموفَّر ولا يمكن تعديله.

جرّب بنفسك

// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
    let order = Order(subtotal: Int(line)!)
    orders.append(order)
    print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
quiz iconاختبر نفسك

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

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

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