Where 절의 활용

박형석·2021년 12월 13일
0

Swift

목록 보기
16/20
post-thumbnail

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 {
// ...
}

// S1과 S2가 Sequence 프로토콜 준수, Sequence안에 있는 연관 타입 Element에 대한 제약을 줄 수도 있음
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 {
 // Element가 Comparable 프로토콜을 준수하는 경우에만 메서드가 동작
 // Stack의 구현부에 제약을 줘도 된다. 
 func sorted() -> [Element] where Element: Comparable {
  return items.sorted()
 }
}

장점

  • 조건 구문이나 논리 연산으로 구현한 코드보다 훨씬 명확, 간편하게 사용할 수 있다.
profile
IOS Developer

0개의 댓글