Swift🐤

swift) where 키워드

성실농장주 2024. 1. 18. 20:53

오늘은 swift에서 where라는 키워드에 대해서 공부해보겠습니다. 

where 키워드는 제네릭 타입이나 extension에서 사용되어 특정 제약을 지정하는 데에 활용됩니다. 

여기서 특정 제약이라고 하는 것을 예시를 통해 설명하겠습니다.

 

제네릭 타입에서 where  키워드사용

설명을 위해 제네릭 함수를 가져왔습니다.

func printIfEqual<T>(value1: T, value2: T) {
    if value1 == value2 {
    //error: "Binary operator '==' cannot be applied to two 'T' operands"
    
        print("\(value1) is equal to \(value2)")
    } else {
        print("\(value1) is not equal to \(value2)")
    }
}

let a = 5
let b = 5
let c = "Hello"
let d = "World"

위에 코드에서는 '==' 연산자는 두개의 T타입을 가진 피연산자에 적용할 수 없다는 에러 메시지가 나타났습니다.

'==' 연산자를 사용하기 위해서는 해당 타입들은 Equatable 프로토콜을 채택해야합니다. 

 

func printIfEqual<T>(value1: T, value2: T) where T: Equatable {
    if value1 == value2 {
        print("\(value1) is equal to \(value2)")
    } else {
        print("\(value1) is not equal to \(value2)")
    }
}

let a = 5
let b = 5
let c = "Hello"
let d = "World"
//Int 혹은 String 타입은 이미 Equatable 프로토콜을 채택하고 있습니다.

printIfEqual(value1: a, value2: b) // 출력: 5 is equal to 5
printIfEqual(value1: c, value2: d) // 출력: Hello is not equal to World

where 키워드를 사용함으로써 T의 타입에 조건을 걸어줍니다. 제네릭 T가 프로토콜 Equtable을 채택하였다는 조건을 걸어줍니다.

"제네릭 타입T가 Equatable 을 채택하였다고 가정하고... 아래 코드를 진행합니다."

다르게 말하자면, "제네릭 타입T가 Equatable 프로토콜을 준수하는 경우에만 아래 코드를 진행합니다."

 

이후에 Int 타입, String 타입을 가진 변수를 해당 함수의 인자로 사용합니다. Int 타입과 String 타입은 이미 Equatable 프로토콜을 채택하고 있어 where 조건에 부합하여 아래 코드를 실행하게 됩니다.

extenstion 사용 시 where 키워드 사용

extension Array where Element: Numeric {
    func sum() -> Element {
        return reduce(0, +)
    }
}

let numbers = [1, 2, 3, 4, 5]
let result = numbers.sum()
print("Sum of numbers: \(result)") // 출력: Sum of numbers: 15

위의 예제에서 where Element: Numeric는 배열의 요소 타입이 Numeric 프로토콜을 준수하는 경우에만 sum() 메서드가 동작하도록 제약을 걸어줍니다.