티스토리 뷰

반응형

 

 

 


Extensions with a Generic Where Clause
Swift Extension에 Where 절 활용하기

개발자는 extension에 제네릭 where 절을 활용할 수도 있습니다. 아래의 예시 코드는 스위프트로 커스텀 정의한 Stack 구조에 대한 extension 사용 예시를 보여주는데요. 해당 Stack 타입에서는 isTop(_:) 메서드를 추가로 정의하고 있습니다. 


Stack타입에서 새롭게 정의된 isTop(_:) 메서드는 해당 타입이 비어있는지를 체크하는데 사용합니다. 컬렉션의 last 값이 존재하지 않는 다는 것은 비어있다는 것을 의미하게 됩니다.

이 때, 만약 제네릭 where 절을 활용하지 않는다면 문제가 발생할 수도 있습니다! isTop(_:) 메서드는 == 연산자를 사용하죠. 하지만 해당 Stact 타입은 Equatable 프로토콜을 준수해야한다는 구체적인 제약사항이 정의되어 있지 않습니다. 그렇기 때문에 만약 Equatable하지 않은 item을 비교하게 된다면 컴파일타임에서 에러가 발생할 수 있게 됩니다. 

제네릭 where 절(Generic Where Clause)을 사용하는 것은 extensions에 새로운 제약사항을 부여할 수 있는 방법입니다. 그렇게 되면 extensions 내의 구현 코드는 Stact이 Equatable을 준수하는 값이 있을경우에만 isTop(_:)메서드를 사용할 수 있도록 제약을 줄 수 있습니다. 

아래에서는 실제로 Stack 타입 인스턴스, stackOfStrings를 사용하는 예시를 보여줍니다. 

 

 


만약 해당 Stack 제네릭 타입이 Equatable 하다면 isTop(_:) 메서드의 사용에 문제가없겠지만, 문제는 Equatable하지않은 타입의 Stack 인스턴스일 경우 입니다. 위의 경우에는 문제없이 isTop(_:) 메서드를 사용할 수 있겠지만 아래의 코드는 문제가 발생할 수 있는 경우를 보여줍니다. 

 

 


만약 Equatable하지 않은 타입의 Stack 인스턴스일 경우, 비교연산자를 사용할 수 없으므로, isTop 메서드를 사용하려 할때 컴파일 타임 에러를 보게 됩니다. 😢
그렇다면 extension에 where 절을 사용해 보도록 합니다!

 

 


Using Where Clause in Extensions
Extensions에 where 절 사용하기


위 코드에서 정의된 startsWith(_:) 메서드는 Container타입에 있는 Item이 1개 이상인지를 확인합니다. 새롭게 추가된 startsWith(_:) 메서드는 기본적으로 Container 프로토콜을 준수하게 되며, 갖고있는 Item은 Equtable해야 합니다.(Equatable을 준수해야 함) 

 

 


startsWith(_:) 메서드 사용 예시는 위와 같습니다. Container 프로토콜을 준수하는 Array 에서 해당 메서드를 사용하고 있습니다. [9, 9, 9] 배열은 42로 시작하지 않으므로 "Starts with something else"를 출력하게 됩니다. 여기서 인자로 사용한 42는 Int 타입이면서 동시에 Equatable 프로토콜을 준수하므로 startsWith(_:) 메서드의 제약사항을 충족하며, 문제없이 사용할 수 있게 됩니다.

이처럼 예시에서 활용되는 제네릭 where 절은 Item이 특정 프로토콜을 준수하는지 등의 제약사항을 구체적으로 명시 해줍니다. 또다른 where 절 사용 예시를 보겠습니다. 

 

 


위의 예시는 Container 프로토콜의 extension 내에 average() 메서드를 추가 정의하고 있습니다. 또한 where 절을 통해 "Item이 Double타입이어야 한다" 라는 제약사항을 추가로 명시합니다.

해당 extension 내에 정의된 average() 메서드는 해당 Container 타입의 Item들을 순회하면서 그 값들을 합산, 평균값을 계산해서 반환합니다. 반환할때에는 count 값을 Double 타입으로 변환하여 부동소수점 연산을 한 뒤 평균값을 반환하게 됩니다.(floating-point division)

위의 예시에서는 where 절에 하나의 조건을 명시했지만 실제로는 필요에 따라 추가적인 조건절을 명시할 수도 있습니다. 조건절을 추가할 때는 ',' 반점을 구분점으로 두어서 여러개의 조건절을 명시하면 됩니다. 🤗

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함