Where!
- 패턴과 함께 일 때 더 유용
- 이번 글에서는 타입에 제약을 주는 where 절의 활용에 대해 알아보자.
프로토콜 익스텐션 활용
- 프로토콜 익스텐션에 where 절을 사용하면, 이 익스텐션이 특정 프로토콜을 준수하는 타입에만 적용될 수 있도록 제약을 줄 수 있다.
- 여러 프로토콜을 제시하고 싶다면, 쉼표로 구분
extension SelfPrintable where Self: FixedWidthIntegeer, Self: SignedInteger {
}
제네릭에 활용
- 타입 매개변수와 연관 타입의 제약을 추가하는데 where 절 사용 가능
- 반환 타입 뒤에 where
- 여러 개는 쉼표로 구분
- 하나의 제약인 경우는 타입 매개변수의 타입으로 설정해도 되지만 제약이 여러 개인 경우는 where 사용
func double<T>(integerValue: T) -> T where T: BinaryInteger {
}
func prints<T, U>(first: T, second: U) where T: CustomStringConvertiable, U: CustomStringConvertible {
}
func compareTwoSequence<S1, S2>(first: S1, second: S2) where S1: Sequence, S2: Sequence, S1.Element: Equtable, S1.Element == S2.Element {
}
- 연관 타입의 경우, 특정 프로토콜을 준수하는 경우에만 제네릭 타입에 프로토콜을 채택하도록 연관 타입에 제약을 줄 수 있다.
protocol Container {
associatedtype ItemType where ItemType: BinaryInteger
var count: ItemType { get }
}
protocol Container where ItemType: BinaryInteger
extension Stack {
func sorted() -> [Element] where Element: Comparable {
return items.sorted()
}
}
장점
- 조건 구문이나 논리 연산으로 구현한 코드보다 훨씬 명확, 간편하게 사용할 수 있다.