מבנה או מחלקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 10 מתוך 57.
ההנחיה של Swift היא להתחיל עם struct ולבחור במחלקה רק כשצריך את מה שרק מחלקות מציעות. מבנים פשוטים יותר: לכל משתנה יש ערך משלו, ולכן שינוי במקום אחד לעולם לא מפתיע קוד במקום אחר.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)פלט:
21.0בחרו במחלקה כאשר צריך לשתף אובייקט אחד: חלקים אחדים בתוכנית צריכים לראות את אותו מצב משתנה, למשל חשבון בנק אחד שבו משתמשים מסכים רבים. מחלקות תומכות גם בירושה, בניגוד למבנים.
class SharedLog {
var lines: [String] = []
}
let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)פלט:
2מבנים יכולים לקבל את == בחינם. הוסיפו Equatable להצהרה, ו-Swift תשווה כל מאפיין; מחלקות משוות זהות באמצעות === במקום זאת:
struct Point: Equatable {
var x: Int
var y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))פלט:
true
falseבדיקה מהירה: אם שני פריטים עם אותם נתונים אמורים להיחשב אותו הדבר, השתמשו ב־struct (נקודה, מחיר, תאריך). אם לפריט יש זהות שחשובה גם כשהנתונים שלו זהים לאלה של פריט אחר (חשבון משתמש, קובץ פתוח), השתמשו ב־class.
struct Money { var cents: Int } // 500 סנט הם 500 סנט
class UserAccount { // לשני חשבונות יכול להיות אותו שם
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}אתגר
קלPoint היא struct שאפשר להשוות באמצעות ==. הוסיפו את ההתאמה לפרוטוקול והשלימו את countDistinct(_:), שמחזירה את מספר הנקודות השונות ברשימה (שתי נקודות זהות כאשר שתי הקואורדינטות שלהן תואמות).
הקוד שסופק קורא נקודה אחת בכל שורה בפורמט x,y ומדפיס distinct: עם מספר הנקודות.
הקוד שלכם צריך להופיע ב-Point.swift וב-Functions.swift. main.swift מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
let points = input.map { line -> Point in
let p = line.split(separator: ",").map { Int($0)! }
return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין