Menu
Coddy logo textTech

החזרת סגירות

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

challenge icon

אתגר

בינוני

צרו שתי פונקציות ליצירת סגירות:

  • greaterThan(_ k: Int) -> (Int) -> Bool: מחזירה פרדיקט שהוא true כשהארגומנט שלו גדול ממש מ־k
  • scaleBy(_ k: Int) -> (Int) -> Int: מחזירה פונקציה שמכפילה את הארגומנט שלה ב־k

קראו שלוש שורות:

  1. מספר שלם threshold
  2. מספר שלם scale
  3. רשימה של מספרים שלמים המופרדים בפסיקים, nums

הדפיסו שלוש שורות:

  1. המספרים שגדולים מהסף (סננו בעזרת הסגירה מ־greaterThan), כשהם מחוברים באמצעות ,
  2. אותם מספרים, לאחר הכפלה (מפו בעזרת scaleBy), כשהם מחוברים באמצעות ,
  3. כמה מספרים עברו את הסינון

עבור הקלט 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; לסנן ואז למפות; להדפיס את הערכים המחוברים ואת מספרם
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

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