Enums עם מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Swift של Coddy. שיעור 15 מתוך 57.
enum מגדיר טיפוס עם קבוצה קבועה של מקרים. ערכים נכתבים עם נקודה, ועל switch לטפל בכל המקרים, כך שהוספת מקרה בהמשך תציג כל מקום שצריך לעדכן:
enum Direction {
case north, east, south, west
}
let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}פלט:
rightל-enum יכולים להיות מתודות ומאפיינים מחושבים. בתוכם, self הוא המקרה הנוכחי:
enum Direction {
case north, east, south, west
var turnedRight: Direction {
switch self {
case .north: return .east
case .east: return .south
case .south: return .west
case .west: return .north
}
}
}
print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)פלט:
east
eastערך גולמי משייך ערך קבוע מסוג אחד לכל מקרה. init(rawValue:) פועל בכיוון ההפוך ומחזיר nil כשאין מקרה תואם:
enum Size: String {
case small = "S", medium = "M", large = "L"
}
print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)פלט:
M
true
trueערכים משויכים מאפשרים לכל מקרה לשאת נתונים משלו, וכך טיפוס אחד יכול להכיל ערכים בעלי מבנים שונים. switch קושר את הנתונים באמצעות let:
enum Payment {
case cash(amount: Int)
case card(number: String, amount: Int)
var amount: Int {
switch self {
case .cash(let amount): return amount
case .card(_, let amount): return amount
}
}
}
let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })פלט:
[20, 55]אתגר
קלהשלם את ה-enum Command באמצעות המקרים forward, back, left ו-right, עם ערכי הגלם F, B, L ו-R. הוסף מאפיין מחושב step שמחזיר את השינוי במיקום: קדימה 1, אחורה -1, שמאלה וימינה 0. לאחר מכן השלם את run(_:), שממיר כל תו לפקודה באמצעות init(rawValue:) (ומדלג על תווים לא מוכרים), ומחזיר position 2, turns 1, skipped 1.
הקוד שסופק קורא שורה אחת של אותיות פקודה ומדפיס את התוצאה של run(_:).
יש לכתוב את הקוד שלך בקבצים Command.swift ו-Functions.swift. הקובץ main.swift מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
// קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var input: [String] = []
while let line = readLine() { input.append(line) }
print(run(input[0]))
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
תרגלו בעצמכם: Swift אונליין