מתודות משנות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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אתגר
קלהשלם את ה־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())
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין