try? ו־try!
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Swift של Coddy. שיעור 46 מתוך 56.
לפעמים לא משנה לך איזו שגיאה פונקציה זרקה, אלא רק לקבל תוצאה או חלופה. Swift מספקת לך שתי צורות קצרות.
try? הופך כל שגיאה שנזרקת ל־nil. התוצאה היא Optional מסוג הערך המוחזר של הפונקציה:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0שלב אותו עם ?? כדי להגדיר ערך ברירת מחדל בתוך השורה. זו הגרסה הקצרה ביותר של "קרא לדבר הזה, ותן לי ערך בכל מקרה".
try! אומר "אני יודע שזה לא יגרום לזריקת שגיאה". אם זה יקרה, התוכנית שלך תקרוס. השתמש בזה רק כשאתה יכול להוכיח שהקריאה בטוחה; בקוד יומיומי, העדף try? עם ערך חלופי או את המבנה המלא do/catch.
אתגר
קלהגדירו NumError: Error עם מקרה אחד bad. הגדירו את parseEven(_ s: String) throws -> Int שזורקת שגיאה, כך ש:
- תזרוק את
.badכאשר אי אפשר לנתח אתsבתורInt, או כאשר הערך שנותח הוא אי־זוגי - אחרת תחזיר את המספר השלם שנותח
קראו שורת קלט אחת: רשימת מחרוזות המופרדות בפסיקים. עבור כל אחת מהן, השתמשו ב־try? ואחריו ב־?? -1 כדי לקבל את המספר השלם הזוגי שנותח, או את -1.
הדפיסו, לפי הסדר, את המספרים השלמים שהתקבלו כשהם מופרדים באמצעות ,. לאחר מכן, בשורה השנייה, הדפיסו את מספר הערכים שהתקבלו בתור -1.
עבור הקלט 4,7,abc,8,11,2, הפלט הוא:
4,-1,-1,8,-1,2
3נסו בעצמכם
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// עבור כל part, (try? parseEven(part)) ?? -1
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
5פונקציות מסדר גבוה חלק 1
מיפוי (Map)סינון (Filter)צמצום (Reduce)שרשור map, filter ו-reduceסיכום – סטטיסטיקות מיליםתרגלו בעצמכם: Swift אונליין