Menu
Coddy logo textTech

מתודות משנות

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

יש לסמן מתודה של struct שמשנה מאפיין בתור mutating. ללא מילת המפתח, המתודה לא מתקמפלת, מכיוון שמתודות של טיפוס ערך מתייחסות אל self כאל קבוע:

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
c.increment()
print(c.count)

פלט:

2

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

var a = Counter()
a.increment()        // תקין

let b = Counter()
// b.increment()     // שגיאה: b הוא קבוע מסוג let

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

struct Stack {
    var items: [Int] = []

    mutating func push(_ x: Int) { items.append(x) }
    mutating func pop() -> Int? { items.popLast() }
    func peek() -> Int? { items.last }
}

var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)

פלט:

8
3

מתודה שמשנה את הערך יכולה להחליף את self לחלוטין, וזה שימושי לאיפוס ערך:

struct Score {
    var points = 0
    var bonus = 0

    mutating func reset() {
        self = Score()
    }
}

var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)

פלט:

0
challenge icon

אתגר

קל

השלם את ה־struct Wallet. המתודות add(_:) ו־spend(_:) הן mutating: המתודה spend מפחיתה כסף רק כשנותר מספיק כסף, ומחזירה אם ביצעה את ההפחתה. המתודה report() אינה mutating ומחזירה balance 40.

הקוד שסופק קורא פקודות +n ו־-n, מחיל אותן על ארנק var יחיד, מדפיס denied כשניסיון הוצאה נדחה, ולבסוף מדפיס את report().

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

נסו בעצמכם

// קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
var wallet = Wallet()
for cmd in input {
    let amount = Int(cmd.dropFirst())!
    if cmd.hasPrefix("+") {
        wallet.add(amount)
    } else if !wallet.spend(amount) {
        print("denied")
    }
}
print(wallet.report())
quiz iconבחנו את עצמכם

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

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

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