Menu
Coddy logo textTech

מבנה או מחלקה

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

אתגר

קל

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))")
quiz iconבחנו את עצמכם

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

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

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