Notice
Recent Posts
Recent Comments
Link
study record
[Swift] where절 본문
*이 글은 책 “스위프트 프로그래밍”을 읽고 작성한 글입니다.
스위프트의 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 |