פונקציות מסדר גבוה מותאמות אישית
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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
}ברגע שתוכל להעביר סגירות ממקום למקום, הספרייה הסטנדרטית תפסיק להיראות כמו קסם ותתחיל להיראות כמו אוסף של תבניות שתוכל לכתוב בעצמך.
אתגר
בינוניכתוב פונקציה חופשית partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]) שעוברת על המערך פעם אחת ומחזירה tuple (matched, rest): איברים שעומדים בתנאי, וכל השאר, שניהם בסדר המקורי.
קרא שתי שורות: מספר שלם min, ואז רשימה של מספרים שלמים המופרדים בפסיקים. השתמש ב-partition שלך עם תנאי שבודק n > min. הדפס:
matched: <...>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]); להדפיס את האיברים המתאימים ואת השאר
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
5פונקציות מסדר גבוה חלק 1
מיפוי (Map)סינון (Filter)צמצום (Reduce)שרשור map, filter ו-reduceסיכום – סטטיסטיקות מילים8סגירות
יסודות הסגירותסגירות נגררותלכידת ערכיםהחזרת סגירותפונקציות מסדר גבוה מותאמות אישיתסיכום – בונה צינורות עיבודתרגלו בעצמכם: Swift אונליין