where절

라무·2023년 8월 9일

정의

💡 조건을 추가하거나 타입에 대한 제약을 추가해줄 때 사용한다
  • 특정 패턴에 Bool 타입 조건을 지정하거나 어떤 타입의 특정 프로토콜 준수 조건을 추가하는 등의 기능을 한다

사용

  • where키워드를 사용하며, 그 뒤에 관련 타입에 대한 제약사항이나 충족해야 하는 관계 조건을 정의하면 된다. 블록의 타입, 메서드가 시작하는 중괄호({})전에 활용할 수 있다

패턴과 결합하여 조건 추가

  • 특정 패턴에 Bool 타입조건을 지정할 수 있음

예시

  • 특정 타입 값을 충족해야 하는 관계 조건을 제약사항으로 둘 수 있다
let arr: [Int] = [1,2,3,4,5,6,7,8]

for i in arr where i % 2 == 0 { //i가 짝 수 있때만 블록 실행
	print(i)
}
  • 옵셔널 패턴과 결합 가능
let arr: [Int?] = [1, 2, 3, 4, 5, 6, 7, 8]
 
// 옵셔널 패턴과 결합
for case let i? in arr where i % 2 == 0 {
    print(i)
}

프로토콜, 익스텐션과 결합

  • 프로토콜 익스텐션에 where절을 사용하게 되면 이 익스텐션이 특정 프로토콜을 준수하는 타입에만 적용될 수 있도록 제약을 줄 수 있다 → 익스텐션이 적용된 프로토콜을 준수하는 타입 중 where 절 뒤에 제시되는 프로토콜도 준수하는 타입만 익스텐션이 적용되도록 제약을 준다는 것을 의미한다
  • 여러 프로토콜을 제시하고 싶다면 쉼표(,)로 구분해준다

예시

  • 프로토콜을 준수하는 타입 → Self: FixedWidthInteger, Self: SignedInteger을 정의(제약)
protocol SelfPrintable {
   func printSelf()
 }

 struct Person: SelfPrintable {}

 extension Int: SelfPrintable {}
 extension UInt: SelfPrintable {}
 extension String: SelfPrintable {}
 extension Double: SelfPrintable {}
 
 extension SelfPrintable where Self: FixedWidthInteger, Self: SignedInteger {
   func printSelf() {
     print("FixedWidthInteger와 SignedInteger을 준수하면서 SelfPrintable을 준수하는 타입 \(type(of:self))")
   }
 }

 extension SelfPrintable where Self: CustomStringConvertible {
   func printSelf() {
     print("CustomStringConvertible을 준수하면서 SelfPrintable을 준수하는 타입 \(type(of:self))")
   }
 }

 extension SelfPrintable {
   func printSelf() {
     print("그 외 SelfPrintable을 준수하는 타입 \(type(of:self))")
   }
 }

참고한 사이트

Swift : 고급 문법 [where 절 - 특정 패턴과 결합]

profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글