מאפיינים מחושבים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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
}
}אתגר
קלהשלימו את המבנה 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)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין