티스토리 뷰
Generic Where Clauses
제네릭 Where 절
타입에 제약을 주는 것(Type Constraints)은 개발자가 제네릭 메서드, 첨자, 타입과 관련한 타입 매개변수의 요구사항을 정의할 수 있게 해줍니다.
이는 관련 타입들에 대한 요구사항 정의에도 유용할 수 있습니다. 관련 타입들의 요구사항 정의를 위해 개발자는 제네릭 where 절을 사용할 수 있습니다. 제네릭 where 절은 관련 타입(accociated type)이 반드시 특정 프로토콜을 준수해야함을 요구사항으로 정의하거나, 관련타입이 어떤 타입의 제약을 갖는지를 정의할 수 있습니다.
제네릭 where 절은 "where" 키워드로 시작하며, 그 뒤를 따라 관련 타입 (associated type) 에 대한 제약사항이나 충족되야하는 관계 조건이 나올 수 있습니다.
스위프트의 where 절은 블록의 타입, 메서드 몸체가 시작하는 중괄호 전에 활용할 수 있습니다.
Using where Clause in for-in loop
for문에 where절 사용하기
위의 예시는 Array 배열 컬렉션을 for문으로 순회하는데 있어 순회하는 요소의 조건을 짝수로 한정해서 출력하는 예시입니다. 이처럼 where절은 프로토콜 타입의 제약 외로 특정 타입 값의 충족해야하는 관계조건을 제약사항으로 둘 수도 있습니다.
Using Where Clause in Methods
메서드에 Where 절 사용하기
또한 아래의 또다른 예시는 allItemsMatch라는 이름의 제네릭 메서드를 정의하고 있습니다. 해당 메서드는 두개의 Container 인스턴스가 동일한 요소 값과 동일한 순서를 갖는지를 판단합니다. 해당 메서드는 그 동일 유무에 따라서 Bool타입의 true/false를 반환합니다.
이때 비교 될 두개의 Container들은 Container타입을 준수하는 인스턴스일뿐, 하위 세부 타입은 서로 동일한 형태여도, 다를 수도 있습니다. 하지만 그들이 갖고 있는 아이템(Item)들의 타입은 같아야 합니다. 이러한 요구사항은 제네릭 where 절에서 정의가 됩니다. 이때 ',' 반점을 통해 다수의 조건을 정의할 수도 있습니다.
위의 메서드는 someContainer, anotherContainer라는 이름라벨을 가진 Container타입 값 2개를 인자로 받습니다. someContainer 인자는 C1타입, anotherContainer 인자는 C2 타입입니다. 이 두개의 C1, C2 타입 인자들은 Container 타입이라는 공통점을 갖습니다. 또한 해당 메서드가 호출 될 때 다음과 같은 결정을 하게 됩니다.
- C1 타입 인자는 Container 프로토콜을 충족해야합니다. -> C1: Container 로 표현됩니다..
- C2 타입 인자또한 C1과 같이 Container 프로토콜을 충족해야합니다. -> C2: Container로 표현됩니다.
- C1 타입에서 갖는 Item은 C2 타입의 Item과 타입이 같아야 합니다.
- C1 타입의 Item은 Equtable 프로토콜을 충족해야합니다.
위의 첫번째, 두번째 요구사항은 메서드 타입 인자값 리스트 내에서 정의되고 있죠. 일반적인 메서드에서도 그렇듯이 말이죠. 그리고 세번째, 4번째 요구사항은 메서드의 제네릭 where 절 뒤에 정의되고 있습니다.
위의 요구사항의 의미를 알아보자면 아래와 같은 의미가 됩니다.
- someContainer는 타입 C1의 Container입니다.
- anotherContainer는 C2 타입의 Conttainer입니다.
- someContainer와 anotherContainer는 동일한 타입의 Item들을 갖습니다.
- someContainer안에 있는 Item들은 Equatable 프로토콜을 충족하므로 각자 Item들이 같은지, 다른지를 판별하기 위해 "==", "!=" 연산자를 사용하게 됩니다.
위의 세번째, 네번째 요구사항은 하나의 의미로 통합해서 생각할 수도 있습니다. 즉, someContainer, anotherContainer 두개의 인자는 Equatable 프로토콜을 준수하는 통일한 타입의 Item을 갖습니다. someContainer, anotherContainer는 통일한 타입 Item을 갖기 때문입니다.
또한 이러한 제약사항으로 두개의 Container인자는 서로 같은지, 다른지를 비교할 수 있게 됩니다. 이들이 같다면(두개의 Container 인자 사이를 비교했을때 차이점이 없었다면,) true를, 다르다면 false를 리턴하게 됩니다.
아래의 코드는 실제로 where 절을 활용한 allItemsMatch(_:_:) 메서드가 어떻게 활용될 수 있는지를 보여줍니다. 😊
위의 예시를 보자면, 아래와 같습니다.
1) 먼저 String 문자열 값을 저장하는 Stack 타입 인스턴스를 생성합니다. "uno", "dos", "tres" 세개의 문자열을 스택에 저장하고 있습니다.
2) 이후 Array 타입의 배열에 동일한 문자열 3개를 저장합니다.
3) 앞서 생성한 Stack타입 인스턴스, Array타입 인스턴스는 allItemsMatch 메서드의 인자로 사용됩니다.
이때 메서드를 정상적으로 사용할 수 있는지를 보자면, 두 개 인자는 서로 타입이 다르지만(Stack, Array) 이 두개의 타입이 Container 프로토콜을 준수하고, 통일한 타입의 값을 갖고 있다면 문제가 없습니다. 또한 이들이 갖고 있는 값은 Equatable하고 비교가 가능하므로 비교를 통해 그 결과를 흭득할 수 있습니다.
이처럼 where 절은 프로토콜, 메서드나 반복문을 구성할때, 특정 제약을 앞서 부여할 수 있게 해줍니다.
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
iOS 생애주기 관리, 프로토콜 UISceneDelegate 개요 (0) | 2020.07.29 |
---|---|
Swift 문법, Extension에 Generic Where 절 활용하기 (0) | 2020.07.28 |
스위프트의 기본 컬렉션 타입 특징 및 사용방법 (0) | 2020.07.26 |
Swift RandomAccessCollection 프로토콜 특징, 사용법 (0) | 2020.07.25 |
Swift 문법, Extension 확장 역할 및 사용방법 (0) | 2020.07.21 |
- Total
- Today
- Yesterday
- 프로그래머스swift
- swift알고리즘
- 백준알고리즘
- uikit
- 개발자문서
- ios
- swift언어
- 프로그래머스
- Protocol
- swift reduce
- 알고리즘문제
- CoreML
- 알고리즘
- swift 기초
- Swift 알고리즘
- swift
- SwiftUI
- 스위프트
- 컬렉션
- swift 문자열
- 백준swift
- publisher
- Collection
- createML
- swift string
- 김프매매
- 부스트코스
- 자연어처리
- 프로토콜
- swift문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |