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

الخصائص المحسوبة

جزء من قسم البرمجة كائنية التوجه في رحلة 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
    }
}
challenge icon

التحدي

سهل

أكمل البنية 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)
quiz iconاختبر نفسك

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

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

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