Enums group related values together. Methods and computed properties add useful actions and information to each enum case.
Enum methods and computed properties in Swift
enum EnumName { case case1 case case2 func methodName() -> ReturnType { // code using self to act based on case } var computedPropertyName: ReturnType { // code returning a value based on self } }
Use func inside enums to add methods.
Use var with a computed getter to add computed properties.
description() returns a string for each direction.enum Direction { case north, south, east, west func description() -> String { switch self { case .north: return "Up" case .south: return "Down" case .east: return "Right" case .west: return "Left" } } }
isSafeToGo returns true only for green light.enum Light { case red, yellow, green var isSafeToGo: Bool { return self == .green } }
enum Temperature { case celsius(Double) case fahrenheit(Double) var inCelsius: Double { switch self { case .celsius(let value): return value case .fahrenheit(let value): return (value - 32) * 5 / 9 } } }
This program defines an enum Mood with a method emoji() and a computed property description. It prints the emoji and description for the current mood.
enum Mood { case happy, sad, angry func emoji() -> String { switch self { case .happy: return "😊" case .sad: return "😢" case .angry: return "😠" } } var description: String { switch self { case .happy: return "Feeling good" case .sad: return "Feeling down" case .angry: return "Feeling mad" } } } let currentMood = Mood.happy print("Mood emoji: \(currentMood.emoji())") print("Mood description: \(currentMood.description)")
Use self inside methods and computed properties to refer to the current enum case.
Computed properties do not store values; they calculate and return them when accessed.
Methods can take parameters and return values, just like functions outside enums.
Enums can have methods to perform actions based on cases.
Computed properties provide calculated values related to enum cases.
These features help keep related code organized and clear.
Practice
Solution
Step 1: Understand enum methods
Enum methods allow you to add functions that perform tasks related to the enum's cases.Step 2: Differentiate from other enum features
Enums do not store extra data like classes; methods help organize related actions.Final Answer:
To perform actions or calculations related to enum cases -> Option CQuick Check:
Enum methods = perform actions [OK]
- Thinking enums can inherit from other enums
- Confusing methods with stored properties
- Assuming enums convert to classes automatically
Solution
Step 1: Identify computed property syntax
Computed properties use var with a code block returning a value, likevar name: Type { ... }.Step 2: Check options
var description: String { return "Example" } matches computed property syntax; B is a method, C is a stored property, D is a static stored property.Final Answer:
var description: String { return "Example" } -> Option DQuick Check:
Computed property syntax = var with braces [OK]
- Using func instead of var for computed properties
- Declaring computed properties as let constants
- Confusing static stored properties with computed ones
enum Direction {
case north, south, east, west
var isVertical: Bool {
return self == .north || self == .south
}
func description() -> String {
switch self {
case .north: return "Up"
case .south: return "Down"
case .east: return "Right"
case .west: return "Left"
}
}
}
let dir = Direction.east
print(dir.isVertical)
print(dir.description())What is the output?
Solution
Step 1: Evaluate computed property isVertical
For Direction.east, isVertical checks if east == north or south, which is false.Step 2: Evaluate description() method
Switch on east returns "Right" string.Final Answer:
false Right -> Option AQuick Check:
east isVertical = false, description = Right [OK]
- Assuming east is vertical
- Confusing method return values with case names
- Forgetting to call method with parentheses
enum Status {
case success, failure
var message: String {
switch self {
case .success:
return "Success"
case .failure
return "Failure"
}
}
}What is the error and how to fix it?
Solution
Step 1: Identify syntax error in switch cases
Case .failure is missing a colon ':' after it, causing a syntax error.Step 2: Fix the syntax
Add ':' after case .failure to correct the switch syntax.Final Answer:
Missing colon after case .failure; add ':' after .failure -> Option BQuick Check:
Switch case syntax requires ':' [OK]
- Thinking computed properties need func keyword
- Adding raw values unnecessarily
- Removing return statements inside computed properties
Light with cases red, yellow, and green. Add a computed property time that returns the duration in seconds for each light: red = 30, yellow = 5, green = 25. Also add a method next() that returns the next light in the traffic cycle (red -> green -> yellow -> red). Which implementation is correct?Solution
Step 1: Check computed property time values
enum Light { case red, yellow, green var time: Int { switch self { case .red: return 30 case .yellow: return 5 case .green: return 25 } } func next() -> Light { switch self { case .red: return .green case .green: return .yellow case .yellow: return .red } } } correctly returns 30 for red, 5 for yellow, and 25 for green as required.Step 2: Check next() method cycle order
enum Light { case red, yellow, green var time: Int { switch self { case .red: return 30 case .yellow: return 5 case .green: return 25 } } func next() -> Light { switch self { case .red: return .green case .green: return .yellow case .yellow: return .red } } } cycles red -> green -> yellow -> red, matching the problem statement.Final Answer:
enum Light { case red, yellow, green var time: Int { switch self { case .red: return 30 case .yellow: return 5 case .green: return 25 } } func next() -> Light { switch self { case .red: return .green case .green: return .yellow case .yellow: return .red } } } -> Option AQuick Check:
Correct time values and cycle order = enum Light { case red, yellow, green var time: Int { switch self { case .red: return 30 case .yellow: return 5 case .green: return 25 } } func next() -> Light { switch self { case .red: return .green case .green: return .yellow case .yellow: return .red } } } [OK]
- Mixing up time values for colors
- Incorrect next() cycle order
- Using func instead of computed property for time
Ready to prove it?
Pass the test and this pattern moves unknown
