الخصائص المحسوبة
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 12 من 57.
تحتفظ الخاصية المخزّنة بقيمة. أما الخاصية المحسوبة فلا تملك مساحة تخزين؛ إذ تشغّل تعليمات برمجية في كل مرة تتم قراءتها فيها، وتُرجع قيمة محسوبة من خصائص أخرى:
struct Rectangle {
var width: Double
var height: Double
var area: Double {
width * height
}
}
var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)الناتج:
12.0
40.0نظرًا لأن القيمة يُعاد حسابها عند كل قراءة، فلا يمكن أن تكون الخاصية المحسوبة قديمة أبدًا. تتم قراءتها مثل الخاصية المخزنة، من دون أقواس:
struct Person {
var first: String
var last: String
var fullName: String {
"\(first) \(last)"
}
}
var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)الناتج:
Ada Lovelaceيمكن أن تحتوي الخاصية المحسوبة أيضًا على مُعيِّن. يتلقى set القيمة الجديدة باعتبارها newValue ويحدّث الخصائص المخزّنة التي يعتمد عليها:
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
}
var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)الناتج:
212.0
0.0استخدم خاصية محسوبة لقيمة تُشتق من قيم أخرى ويكون حسابها غير مكلف. استخدم دالة عندما تتطلب العملية معاملات أو تكون مكلفة:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // خاصية: بدون وسائط
func total(withTax rate: Int) -> Int { // دالة: تأخذ وسيطًا
total + total * rate / 100
}
}التحدي
سهلأكمل البنية Circle بخاصية مخزّنة radius وثلاث خصائص محسوبة للقراءة فقط: diameter (ضعف نصف القطر)، وarea (π r²، باستخدام Double.pi) وlabel، التي تُرجع r=2.0 d=4.0 a=12.57 مع تقريب المساحة إلى منزلتين عشريتين باستخدام String(format: "%.2f", area).
يقرأ الكود المزوّد نصف قطر واحدًا في كل سطر، وينشئ Circle، ويطبع label. ثم يضاعف نصف قطر الدائرة الأخيرة ويطبع label الخاص بها مرة أخرى، لذا يجب أن تتبع القيم نصف القطر.
ضع الكود الخاص بك في Circle.swift. يحتوي main.swift على كود الإدخال/الإخراج المزوّد، ولا يمكن تعديله.
جرّب بنفسك
import Foundation
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
last = Circle(radius: Double(line)!)
print(last.label)
}
last.radius *= 2
print(last.label)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكال3الخصائص بتعمّق
الخصائص المحسوبةمراقبو الخصائصالأعضاء الثابتةالتعدادات مع الدوالمراجعة - سجل درجات الحرارةتدرّب بنفسك: Playground لـ Swift