Menu
Coddy logo textTech

מבנים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 7 מתוך 57.

struct מקבץ נתונים ומתודות כמו מחלקה. Swift כותבת אתחול מבוסס-חברים לכל struct, עם פרמטר אחד לכל מאפיין, ולכן struct לא זקוק ל-init משלו:

struct Point {
    var x: Int
    var y: Int

    func distanceFromOrigin() -> Int {
        abs(x) + abs(y)
    }
}

let p = Point(x: 3, y: -4)
print(p.x)
print(p.distanceFromOrigin())

פלט:

3
7

אפשר להשמיט את המאפיינים שיש להם ערכי ברירת מחדל מהאתחול לפי חברים:

struct Settings {
    var volume = 5
    var muted = false
}

let quiet = Settings(volume: 1)
print(quiet.volume)
print(quiet.muted)

פלט:

1
false

מבנה שנשמר בקבוע let אינו יכול להשתנות כלל, אפילו לא המאפיינים שלו מסוג var. שמור אותו במשתנה var כדי לשנות אותו:

let fixed = Point(x: 1, y: 2)
// fixed.x = 5    // שגיאה: אי אפשר להקצות ערך, fixed הוא קבוע מסוג let

var moving = Point(x: 1, y: 2)
moving.x = 5       // תקין

רבים מהטיפוסים המובנים של Swift הם מבנים: Int, Double, String, Array ו־Dictionary. המבנים שלך מתנהגים באותו אופן כמו הטיפוסים האלה: הם ערכים פשוטים.

struct Money {
    var cents: Int
    func formatted() -> String {
        "\(cents / 100).\(cents % 100 < 10 ? "0" : "")\(cents % 100)"
    }
}

print(Money(cents: 1250).formatted())
print(Money(cents: 305).formatted())

פלט:

12.50
3.05
challenge icon

אתגר

קל

הכרז על struct בשם Item עם המאפיינים name (String), price (Int, בסנטים) ו-quantity (Int). הוסף מתודה total() שמחזירה את המחיר כפול הכמות, ומתודה line() שמחזירה 2 x tea = 350.

הקוד שסופק קורא פריט אחד בכל שורה בפורמט name,price,quantity, יוצר כל Item באמצעות אתחול memberwise ומדפיס את line(). לאחר מכן הוא מדפיס את sum: ואת סכום כל הסכומים.

הקוד שלך ייכנס לקובץ Item.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

// קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
var sum = 0
for row in input {
    let p = row.split(separator: ",").map(String.init)
    let item = Item(name: p[0], price: Int(p[1])!, quantity: Int(p[2])!)
    print(item.line())
    sum += item.total()
}
print("sum: \(sum)")
quiz iconבחנו את עצמכם

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

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

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