스위프트의 항목 순회
2022/12/13(화요일)
[스위프트]
4.5.4 항목 순회
우리는 때때로 열거형에 포함된 모든 케이스를 알아야 할 때가 있습니다. 그럴 때 열거형의 이름 뒤에 콜론(;)을 작성하고 한 칸 띄운 뒤 CaseIterable 프로토콜을 채택해주세요. 그러면 열거형 allCases라는 이름의 타입 프로퍼티를 통해 모든 케이스의 컬렌션을 생성해준다
enum School: CaseIterable{
case primary
case elementary
case middle
case high
case college
case university
case graduate
}
let allCases: [School] = School.allCases
print(allCases)
// [School.primary, School.elementary, School.middle, School.high ... School.graduate]
원시값을 갖는 열거형이라면 원시값의 타입 다음에 쉼표(,)를 쓰고 띄어쓰기를 한 후 CaseIterable 프로토콜을 채택해 주면 된다.
enum School: String{
case primary = "유치원"
case elemenatary = "초등학교"
case middle = "중학교"
case high = "고등학교"
case college = "대학"
case university = "대학교"
case graduate = "대학원"
}
let allCaces: [School] = School.allCases
위 코드 두개처럼 단순한 열거형에는 CaseIterable 프로토콜을 채택해 주는 것만으로 allCases 프로퍼티를 사용할 수 있다. 그렇지만 조금 복잡해지는 열거형은 그렇지 않을 수도 있다.
4.5.5 순환 열거형
순환 열거형은 열거형 항목의 연관 값이 열거형 자신의 값이고자 할 때 사용한다. 순환 열거형을 명시하고 싶다면 indirect 키워드를 사용하면 된다. 특정 항목에만 한정하고 싶다면 case 키워드 앞에 indirect를 붙이면 되고, 열거형 전체에 적용하고 싶다면 enum 키워드 앞에 indirect 키워드를 붙이면 된다.
다음은 산술 연산을 위해 정의한 열거형
(특정 항목에 순환 열거형 항목 명시)
enum AritmeticExpression{
case number(int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
(열거형 전체에 순환 열거형 명시)
indirect enum ArithmeticExpression{
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
위의 열거형에는 정수를 연관 값으로 갖는 number라는 항목이 있고 덧셈을 위한 addition이라는 항목, 곱셈을 위한 multiplicaion 항목이 있다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let final = ArithmeticExpression.nultiplication(sum, ArithmeticExpression.number(2))
func evaluate(_ expression: ArithmeticExpression) -> Int{
switch expression{
case .number(let value):
return value
case .addition(let left, let right):
return evaluate(left) + evaluate(right)
case .multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
let result: Int = evaluate(final)
print("(5 + 4) * 2 = \(result)")
위 코드는 ArithmeticExpression 열거형을 사용하여 (5 + 4) x 2 연산을 구현해보는 예제다.
evaluate는 ArithmeticExpression 열거형의 계산을 도와주는 순환 함수다.