Menu
Coddy logo textTech

סמנטיקה של ערכים

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

מבנים הם טיפוסי ערך: השמה של מבנה למשתנה אחר יוצרת עותק שלו. שינוי העותק משאיר את המקור ללא שינוי, בניגוד למחלקה:

struct Point {
    var x: Int
}

var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)

פלט:

1
99

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

class PointRef {
    var x: Int
    init(x: Int) { self.x = x }
}

let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)

פלט:

99

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

struct Point {
    var x: Int
}

func shifted(_ p: Point, by dx: Int) -> Point {
    var copy = p
    copy.x += dx
    return copy
}

let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)

פלט:

1
5

מערכים של מבנים מכילים ערכים עצמאיים. שינוי של איבר באמצעות האינדקס שלו משנה רק את אותו איבר, והעתקת המערך מעתיקה כל ערך:

struct Score {
    var points: Int
}

var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)

פלט:

1
50
challenge icon

אתגר

קל

השלימו את tryDiscount(_:percent:). היא מקבלת מבנה Price ומחזירה עותק מוזל: מספר הסנטים מופחת לפי האחוז, בעיגול כלפי מטה. הקוד שסופק מדפיס את המחיר המקורי ואת המחיר המוזל, ולכן המחיר המקורי חייב להישאר ללא שינוי.

הקוד שסופק קורא מחיר בסנטים ואחוז אחד בכל שורה, ומדפיס was 1000, now 900 עבור כל אחד מהם.

הקוד שלכם ייכתב בקבצים Price.swift ו-Functions.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.

נסו בעצמכם

// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
let original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
    let cheaper = tryDiscount(original, percent: Int(line)!)
    print("was \(original.cents), now \(cheaper.cents)")
}
quiz iconבחנו את עצמכם

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

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

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