안녕하세요, iOS 개발하는 루피입니다!
오늘은 Swift 공식문서를 바탕으로 Where 에 대해 공부해 보겠습니다.
바로 시작합니다.
Where 절 이란?
where 절은 특정 패턴과 경합하여 조건을 추가하는 역할을 합니다. 우리는 특히 크게 두 가지 용도로 사용할 수 있습니다.
- 패턴과 결합하여 조건 추가
- 타입에 대한 제약 추가
쉽게 말해 특정 패턴에 Bool 타입 조건을 지정하거나 어떤 타입의 특정 프로토콜 준수 조건을 추가하는 등의 기능이 있습니다.
예제 코드로 알아보기
글을 적는 거보다 아무래도 코드 몇 줄 적어보는게 더 이해가 빠르지 않을까요???
바로 코드로 알아보겠습니다.
1. 값 바인딩에서
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 let (x, y) where x > y: print("x가 y보다 큽니다.")
default: print("조건에 맞지 않습니다.")
}
}
2. 옵셔널 패턴에서
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
for case let number? in arrayOfOptionalInts where number > 2 {
print("Found a \(number)")
}
3. 타입캐스팅 패턴에서
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")
default: print("unknown type")
}
4. 프로토콜 익스텐션에서
extension Collection where Element: Numeric {
func sum() -> Element {
return self.reduce(0, +)
}
}
let intArray = [1, 2, 3, 4]
let doubleArray = [1.1, 2.2, 3.3]
let stringArray = ["a", "b", "c"]
print(intArray.sum()) // 출력: 10
print(doubleArray.sum()) // 출력: 6.6
// stringArray.sum() -> 컴파일 오류 (Element가 Numeric을 준수하지 않음)
5. 제네릭 함수 타입 제한에서
// 타입 매개변수 T가 BinaryInterger 프로토콜을 준수하는 타입
func double<T>(integerValue: T) -> T where T: BinaryInteger {
return integerValue * 2
}
위 함수는 다음과 같은 표현으로 변경 가능합니다.
func double<T: BinaryInteger>(integerValue: T) -> T {
return integerValue * 2
}
6. 프로토콜의 연관 타입 타입 제한에서
protocol Container {
associatedtype ItemType where ItemType: BinaryInteger
var count: Int { get }
mutating func append(_ item: ItemType)
subscript(i : Int) -> ItemType { get }
}
위 프로토콜은 다음과 같은 표현으로 변경 가능합니다.
protocol Container where ItemType: BinaryInteger {
associatedtype ItemType
var count: Int { get }
mutating func append(_ item: ItemType)
subscript(i: Int) -> ItemType { get }
}
7. 제네릭 타입의 연관 타입 제약 추가
protocol Talkable { }
protocol CallToAll {
func callToAll()
}
struct Person: Talkable { }
struct Animal { }
extension Array: CallToAll where Element: Talkable {
func callToAll() { }
}
let people: [Person] = []
let cats: [Animal] = []
people.callToAll()
// cats.callToAll() // 컴파일 오류 !!
Person 타입은 Talkable 프로토콜을 준수하지만, Animal 타입은 Talkable 프로토콜을 준수하지 않습니다.
Element 타입이 Talkable 프로토콜을 준수하는 경우에만 Array 타입에 CallToAll 프로토콜을 채택했으므로 Animal 타입을 요소로 갖는 Array 타입은 CallToAll 프로토콜을 채택하지 않습니다.
오늘도 화이팅입니다!
'iOS > Swift' 카테고리의 다른 글
| [Swift]DispatchObject (0) | 2025.02.13 |
|---|---|
| [Swift] 프로토콜 (Protocol) (0) | 2025.02.06 |
| [Swift] 제네릭(Generics) (1) | 2025.02.04 |
| [Swift] ARC (0) | 2025.01.28 |
| [Swift] Delegate 패턴을 구현해 사용해 보자 (0) | 2025.01.17 |