בניית צינורות עיבוד
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 31 מתוך 56.
השיטות שאספת, map, filter, reduce, compactMap, flatMap, sorted(by:), הן ארגז הכלים היומיומי של Swift. בקוד אמיתי משלבים ביניהן.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]קרא את השרשרת מלמעלה למטה: השאר הזמנות שאינן ריקות, מיין לפי הכמות בסדר יורד, ואז השאר רק את השמות.
צינורות עיבוד יעילים יותר כשכל שלב ממלא מטרה אחת. אם שמים לב שעושים שני דברים בו־זמנית בתוך סגירה (מיפוי וגם סינון), פצלו אותם לשני שלבים. השרשרת נשארת קריאה גם כשהיא מתארכת.
אתגר
בינוניקרא שורת קלט אחת: רשימה מופרדת בפסיקים של רשומות name:price:qty. חלק מהרשומות פגומות ויש לדלג עליהן: כל רשומה שהמחיר או הכמות שבה אינם מספר שלם תקין.
בנה צינור עיבוד שמפיק שורה אחת לכל רשומה תקינה שעבורה qty > 0, ממוינות לפי הסכום הכולל (price * qty) בסדר יורד, בפורמט:
<name>: <total>אחרי השורות לכל פריט, הדפס שורת סיכום אחת: Sum: <n> עם הסכום הכולל.
עבור הקלט apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7, הפלט הוא:
milk: 20
salt: 14
apple: 6
Sum: 40נסו בעצמכם
let entries = readLine()!.components(separatedBy: ",")
// TODO: שרשור פעולות באמצעות compactMap (פענוח), filter (qty > 0),
// sorted (total בסדר יורד), map (עיצוב); הדפסת השורות + Sum
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
5פונקציות מסדר גבוה חלק 1
מיפוי (Map)סינון (Filter)צמצום (Reduce)שרשור map, filter ו-reduceסיכום – סטטיסטיקות מיליםתרגלו בעצמכם: Swift אונליין