Menu
Coddy logo textTech

פונקציות מסדר גבוה מותאמות אישית

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 42 מתוך 56.

עכשיו אפשר לכתוב פונקציות מסדר גבוה משלך, והן ישתלבו היטב לצד map ו־filter. המבנה תמיד זהה: מקבלים פרמטר מסוג closure, קוראים לו בתוך הלולאה ומחזירים את התוצאה.

extension Array {
    func myMap<T>(_ transform: (Element) -> T) -> [T] {
        var result: [T] = []
        for item in self {
            result.append(transform(item))
        }
        return result
    }
}

[1, 2, 3].myMap { $0 * 10 }       // [10, 20, 30]

אם תוספים נראים לך כמו יותר מדי, כתוב פונקציה חופשית במקום זאת; הרעיון זהה:

func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
    var n = 0
    for item in items where predicate(item) {
        n += 1
    }
    return n
}

ברגע שתוכל להעביר סגירות ממקום למקום, הספרייה הסטנדרטית תפסיק להיראות כמו קסם ותתחיל להיראות כמו אוסף של תבניות שתוכל לכתוב בעצמך.

challenge icon

אתגר

בינוני

כתוב פונקציה חופשית partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]) שעוברת על המערך פעם אחת ומחזירה tuple (matched, rest): איברים שעומדים בתנאי, וכל השאר, שניהם בסדר המקורי.

קרא שתי שורות: מספר שלם min, ואז רשימה של מספרים שלמים המופרדים בפסיקים. השתמש ב-partition שלך עם תנאי שבודק n > min. הדפס:

  1. matched: <...>
  2. rest: <...>

כל רשימה מחוברת באמצעות , (או ריקה כשאין מה להדפיס).

עבור הקלט 5 / 2,7,3,8,5, הפלט הוא:

matched: 7,8
rest: 2,3,5

נסו בעצמכם

let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: partition(_:by:) -> ([Int], [Int]); להדפיס את האיברים המתאימים ואת השאר
quiz iconבחנו את עצמכם

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

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

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