study record

[Swift] where절 본문

Swift/스위프트 프로그래밍

[Swift] where절

asong 2022. 1. 24. 13:37

*이 글은 책 “스위프트 프로그래밍”을 읽고 작성한 글입니다.

 

 

스위프트의 where절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다. 조건을 더 추가하고 싶을 때, 특정 타입에 제한을 두고 싶을 때 등등 다양한 용도로 사용된다.

where 절의 활용

where 절은 크게 두 가지 용도로 사용된다.

  • 패턴과 결합하여 조건 추가
  • 타입에 대한 제약 추가

다시 말해 특정 패턴에 Bool 타입 조건을 지정하거나 어떤 타입의 특정 프로토콜 준수 조건을 추가하는 등의 기능이 있다.

// 값 바인딩, 와일드카드 패턴과 where 절의 활용

let tuples: [(Int, Int)] = [(1, 2), (1, -1), (1, 0), (0, 2)]
 
for tuple in tuples {
	switch tuple {
	case let (x, y) where x == y: print( "x==y")
	case let (x,y) where x== -y: print("x == -y")
	case (1, _): print("x == 1")
	default: print("\(tuple.0), \(tuple.1)")
}
}

var repeatCount: Int = 0
for tuple in tuples {
	switch tuple {
	case let (x, y) where x == y && repeatCount > 2 : print("x==y")
	case let (x, y) where repeatCount < 2: print("\(x), \(y)")
	default: print("nothing")
	}
	repeatCount += 1
}

 

// 옵셔널 패턴과 where 절의 활용

let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]

for case let number? in arrayOfOptionalInts where number > 2 {
	print("found a \(number)")
}

 

where 절을 타입캐스팅 패턴과 결합할 수 있다.

let anyValue: Any = "ABC"

switch anyValue {
case let value where value is Int: print("value is Int")
case let value where value is String: print("value is String")
case let value where value is Double: print("value is Double")
default: print("unknown type")
}

 

프로토콜 익스텐션에 where 절을 사용하면 이 익스텐션이 특정 프로토콜을 준수하는 타입에만 적용될 수 있도록 제약을 줄 수 있다. 다시 말해 익스텐션이 적용된 프로토콜을 준수하는 타입 중 where 절 뒤에 제시되는 프로토콜도 준수하는 타입만 익스텐션이 적용되도록 제약을 줄 수 있다는 뜻이다.

protocol SelfPrintable {
	func printSelf()
}

struct Person: SelfPrintable { }

extension Int: SelfPrintable { }

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

 

타입 매개변수와 연관타입의 제약을 추가하는 데 where 절을 사용하기도 한다. 제네릭 함수의 반환 타입 뒤에 where 절을 포함하면 타입매개변수와 연관 타입에 요구사항을 추가할 수 있다.

func doubled<T>(integerValue: T) -> T where T: BinaryInteger {
	return integerValue * 2
}

func prints<T, U>(first: T, second: U) where T: CustomStringConvertible, U: CustomStringConvertible {
	print(first)
	print(second)
}

 

Element가 Comparable 프로토콜을 준수하는 경우에만 메서드가 동작하도록 where 절을 통해 제약을 줄 수 있다.

extension Stack {
	func sorted() -> [Element] where Element: Comparable {
		return items.sorted()
	}
}

'Swift > 스위프트 프로그래밍' 카테고리의 다른 글

[Swift] 오류 처리  (0) 2022.02.06
[swift] ARC  (0) 2022.02.04
[Swift] 패턴  (0) 2022.01.20
[Swift] 타입 중첩  (0) 2022.01.19
[Swift] 프로토콜 지향 프로그래밍  (0) 2022.01.18