swift

[swift] CaseIterable protocol

순진이 2021. 12. 11. 22:13

오늘은 강의를 듣던 중 넘나 유용해서 정리하게 된 CaseIterable protocol 특집!
CaseIterable는 못참지,,,

시작~


CaseIterable protocol

 

이 프로토콜은 "모든 값들은 컬렉션으로 제공해주는 타입"이에요.
보통 연관값(associated value)가 없는 열거형(Enum) 타입에서 주로 사용하쥬.
이 타입을 사용하면 allCases라는 속성을 통해서 모든 케이스들의 컬렉션에 접근할 수가 있어요.


뭔말이에유?
예시 ㄱㄱㄲㄲ ㄲㄱㄲㄱ


여기 CaseIterable 프로토콜을 채택한 열거형이 있습니다. (연관값 없음)

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


이렇게 CaseIterable 프로토콜을 채택하기만 하면, 아래와 같은 타입 속성이 저절로 구현이 되는거죠.
그래서 우리는 이 프로토콜을 채택한 타입에서 점문법(.)를 사용하여 allCases라는 속성에 접근이 가능쓰!
(그대신 타입 메서드기 때문에 항상 타입.속성으로 접근해야 함!)



우리가 만든 CompassDirection 열거형도 allCases 속성을 이용해 배열로 리턴이 될 수 있답니다.
또한 컬렉션으로 리턴되기 때문에 아래처럼 count 속성을 사용할 수 있어욧

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

let compassArray = CompassDirection.allCases 
//[north, south, east, west] 

print(CompassDirection.allCases.count)
//4



그리고 배열이기 때문에, for-in 반복문에서도 활용이 가능하겠쥬?

for i in CompassDirection.allCases { 
	print("CompassDirection : \(i)") 
}

//CompassDirection : north 
//CompassDirection : south 
//CompassDirection : east 
//CompassDirection : west



고차함수와도 활용해볼 수 있어요11. (map 활용)

let compassArray = CompassDirection.allCases.map { direction in
	return "My compass is \(direction)" 
}

/*
["My compass is north", 
"My compass is south", 
"My compass is east", 
"My compass is west"]
*/


고차함수와도 활용해볼 수 있어요22. (map&joined 활용)

let compassArray = CompassDirection.allCases.map { direction in 
	return "My compass is \(direction)" }.joined(separator: ", ") 
}

/*
"My compass is north, 
My compass is south, 
My compass is east, 
My compass is west"
*/

joined()라는 메서드는 연속적인 요소들을 합쳐지게(joined) 만들어 새로운 문자열로 리턴을 해주는 메서드구요.
합쳐지는 과정에서 각 요소들 사이를 seperator라는 파라미터로 구별해줍니다.
저는 ", "라는 seperator를 사용해서 각 값들을 구분해준거구요.


그 외에도 기본적으로 배열이기 때문에 아래와 같은 속성/메서드들도 사용이 가능해요.

CompassDirection.allCases.randomElement() 
//east 

CompassDirection.allCases.endIndex 
//4 

CompassDirection.allCases.isEmpty
//false


(당연하겠지만) 이미 정의된 열거형의 케이스들을 활용하는 것이기 때문에? 배열의 요소에 변화를 가져오는 것은 안되더라구요.
removeAll(), removeFirst(), removeLast()와 같은 것들이요.

 



언제 사용할지는 잘 모르겠지만? 그냥 유용할 것 같다는 너낌이 오는 CaseIterable protocol에 대해 알아봤습니다.
힙하게 CaseIterable protocol 쓰는 그날까지 나 샛기 화이팅,,,

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

 

Apple Developer Documentation

developer.apple.com