לכידת ערכים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 40 מתוך 56.
סגירה זוכרת את המשתנים שהיו בתחום הפעולה כשהיא נוצרה. גוף הסגירה יכול לקרוא אותם ואף לשנות אותם בהמשך, גם לאחר שהפונקציה העוטפת הסתיימה. זה נקרא לכידה.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3כל קריאה ל־makeCounter נותנת לך count חדש לגמרי, כך ששני מונים לעולם לא חולקים מצב:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2לכידה היא מה שהופך סגירות לעוצמתיות יותר מפונקציות רגילות: הן נושאות איתן מצב. תראו את אותו הטריק ב-JavaScript, ב-Python ובשפות רבות אחרות.
אתגר
בינוניבנו מפעל קטן ליצירת מונים.
הגדירו פונקציה makeCounter(start: Int, step: Int) שמחזירה סגירה מסוג () -> Int. כל קריאה לסגירה מחזירה את הערך הבא: הקריאה הראשונה מחזירה את start, הבאה מחזירה את start + step, הבאה את start + 2*step, וכן הלאה.
קראו שלושה מספרים שלמים מהקלט: start, step ו-n. בנו מונה עם start ו-step, ואז קראו לו n פעמים והדפיסו כל תוצאה בשורה נפרדת.
עבור הקלט 5 / 3 / 4, הפלט הוא:
5
8
11
14נסו בעצמכם
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: ליצור makeCounter(start:step:) -> () -> Int שלוכדת את הערך המשתנה
// לאחר מכן לקרוא לה n פעמים ולהדפיס כל תוצאה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
תרגלו בעצמכם: Swift אונליין