iOS

[iOS] CaseIterable

thoonk: 2021. 6. 27. 15:31
반응형

CaseIterable 프로토콜에 관해 기록합니다. 

 

protocol CaseIterable

CaseIterable 프로토콜을 사용하면 Collection과 같이 enum의 값들을 순회할 수 있도록 해준다.

 

enum CompassDirection: CaseIterable {
    case north, south, east, west
}

print("There are \(CompassDirection.allCases.count) directions.")
// Prints "There are 4 directions."
let caseList = CompassDirection.allCases
                               .map({ "\($0)" })
                               .joined(separator: ", ")
// caseList == "north, south, east, west"

위 코드와 같이 CompassDirection의 allCases 프로퍼티를 통해 cases에 접근할 수 있다.

여기서 allCases는 이 타입의 모든 값의 collection이다.

위 코드를 보고 알 수 있듯이, allCases는 Collection 프르토콜을 따르므로 collection 타입에서 사용할 수 있던 map(), reduce() 등을 사용할 수 있다. 또한, count, isEmpty 등의 프로퍼티를 사용할 수 있다.

 

 

CaseIterable은 별도로 구현해야 할 것 없이 선언만 해주면 편하게 사용할 수 있다.

enum Language: String, CaseIterable {
    case Korean = "kr"
    case Chinese = "cn"
    case Japenese = "jp"
}

// cases를 순차적으로 접근하여 출력
Language.allCases.forEach {
    print("\($0): \($0.rawValue)")
}
/*
 Korean: kr
 Chinese: cn
 Japenese: jp
 */

// cases의 개수 출력
print(Language.allCases.count) // 3

// case의 값이 k로 시작하는 case 출력
print(Language.allCases
        .filter { $0.rawValue.prefix(1) == "k" }) // [Language.Korean]

 

참고:

https://developer.apple.com/documentation/swift/caseiterable

 

부족한 점은 피드백해주시면 감사합니다😊

반응형