الأعضاء الثابتة
جزء من قسم البرمجة كائنية التوجه في رحلة 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)" } // الثابت يقرأ الثابت
}التحدي
سهلأكمل الصنف 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))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكال3الخصائص بتعمّق
الخصائص المحسوبةمراقبو الخصائصالأعضاء الثابتةالتعدادات مع الدوالمراجعة - سجل درجات الحرارةتدرّب بنفسك: Playground لـ Swift