סגירות נגררות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 39 מתוך 56.
כאשר closure הוא הארגומנט האחרון לפונקציה, אפשר לכתוב אותו מחוץ לסוגריים. זוהי צורת trailing-closure, וכך קוד Swift נקרא באופן טבעי.
let nums = [1, 2, 3]
// הצורה הרגילה
let a = nums.map({ $0 * 2 })
// צורה עם סגירה בסוף
let b = nums.map { $0 * 2 }אם הסגירה היא הארגומנט היחיד, גם הסוגריים נעלמים. זו הסיבה שכל מה שראית עד כה נראה כמו מבנה בקרה מותאם אישית.
אפשר לכתוב פונקציות משלך שמקבלות סגירות באותו אופן:
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}צורת הסגירה הנגררת גורמת ל-repeatN(3) { ... } להיראות כמו לולאה מובנית. זו בדיוק המטרה: מבני בקרה שבונים בעצמכם נראים בדיוק כמו אלה שבספרייה הסטנדרטית.
אתגר
קלהגדירו פונקציה collect ש:
- מקבלת מספר שלם
nוסגירהbuilder: (Int) -> String - קוראת ל־
builderעבור כלiמ־1עדn(כולל), ומחזירה את המערך של המחרוזות שנוצרו
קראו מספר שלם מהקלט הסטנדרטי, קראו ל־collect עם המספר הזה באמצעות סגירה נגררת שמייצרת "i=<i>" עבור כל ערך, והדפיסו את התוצאה המאוחדת באמצעות ,.
עבור הקלט 4, הפלט הוא i=1,i=2,i=3,i=4.
נסו בעצמכם
let n = Int(readLine()!)!
// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// לאחר מכן יש לקרוא ל־collect(n) { ... } ולהדפיס את התוצאה כשהיא מחוברת באמצעות ","
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
תרגלו בעצמכם: Swift אונליין