החזרת סגירות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 41 מתוך 56.
ראית את makeCounter מחזירה סגירה. אותה תחבולה מאפשרת לך לבנות התנהגות ניתנת להגדרה: לקבל פרמטרים פעם אחת ולקבל בחזרה פונקציה שמשתמשת בהם פעמים רבות.
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4)) // 12
print(tenfold(4)) // 40הסגירה המוחזרת לוכדת את k, כך שכל קריאה ל־multiplier(...) יוצרת סגירה חדשה לגמרי עם k משלה.
התבנית הזאת היא הליבה של קוד "אסטרטגיה" ב-Swift: כתוב פונקציה שמקבלת תצורה ומחזירה סגירה, ואז העבר את הסגירה אל map, filter, sorted(by:), או לכל מקום אחר שבו מצופה ערך בצורת פונקציה.
אתגר
בינוניצרו שתי פונקציות ליצירת סגירות:
greaterThan(_ k: Int) -> (Int) -> Bool: מחזירה פרדיקט שהואtrueכשהארגומנט שלו גדול ממש מ־kscaleBy(_ k: Int) -> (Int) -> Int: מחזירה פונקציה שמכפילה את הארגומנט שלה ב־k
קראו שלוש שורות:
- מספר שלם
threshold - מספר שלם
scale - רשימה של מספרים שלמים המופרדים בפסיקים,
nums
הדפיסו שלוש שורות:
- המספרים שגדולים מהסף (סננו בעזרת הסגירה מ־
greaterThan), כשהם מחוברים באמצעות, - אותם מספרים, לאחר הכפלה (מפו בעזרת
scaleBy), כשהם מחוברים באמצעות, - כמה מספרים עברו את הסינון
עבור הקלט 5 / 3 / 2,7,3,8,9, הפלט הוא:
7,8,9
21,24,27
3נסו בעצמכם
let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: greaterThan, scaleBy; לסנן ואז למפות; להדפיס את הערכים המחוברים ואת מספרם
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
תרגלו בעצמכם: Swift אונליין