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