Menu
Coddy logo textTech

מאפיינים מחושבים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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

לתכונה מחושבת יכול להיות גם setter. 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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Swift אונליין