T
, U
, V
, Key
, Value
, 등). 함수 또는 초기화 구문의 시그니처를 포함하는 나머지 타입, 함수, 또는 초기화 구문 선언에서 타입 파라미터와 모든 연관된 타입에 접근할 수 있습니다.T: Comparable
은 타입 파라미터 T
를 대신하는 모든 타입 인수는 Comparable
프로토콜을 준수해야 함을 나타냅니다.Int
와 Double
은 Comparable
프로토콜을 준수하므로 이 함수는 두 타입의 인수를 허용합니다. 제너릭 타입과 다르게 제너릭 함수 또는 초기화 구문을 사용할 때 제너릭 인수 절을 지정하지 않습니다. 대신에 타입 인수는 함수나 초기화 구문에 전달되는 인수의 타입으로 부터 유추됩니다.where
절을 포함하여 타입 파라미터와 연관된 타입의 요구사항을 추가로 지정할 수 있습니다. 제너릭 where
절은 where
키워드 다음에 콤마로 구분된 하나 이상의 요구사항 (requirements) 로 구성됩니다.where
절에서 요구사항 (requirements) 은 클래스를 상속하거나 프로토콜 또는 프로토콜 구성을 준수하는 타입 파라미터를 지정합니다. 제너릭 where
절은 예를 들어 <T: Comparable>
은 <T> where T: Comparable
과 동일하듯 타입 파라미터에 제약사항을 간단하게 표현하는 구문 설탕을 제공하지만 타입 파라미터와 연관된 타입에 더 복잡한 제약사항을 제공하기 위해 사용할 수 있습니다. 예를 들어 프로토콜을 준수하도록 타입 파라미터의 연관된 타입을 제한할 수 있습니다. 예를 들어 <S: Sequence> where S.Iterator.Element: Equatable
은 S
가 Sequence
프로토콜을 준수하고 연관된 타입 S.Iterator.Element
는 Equatable
프로토콜을 준수하도록 지정합니다. 이 제약사항은 시퀀스의 각 요소는 동등함을 보장합니다.==
연산자를 사용하여 두 타입이 동일해야 하는 요구사항을 지정할 수도 있습니다. 예를 들어 <S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.Element
은 S1
과 S2
가 Sequence
프로토콜을 준수하고 두 시퀀스의 요소는 같은 타입이어야 한다는 제약사항이 있습니다.where
절은 타입 파라미터를 포함하는 선언의 부분으로 또는 타입 파라미터를 포함하는 선언의 내부에 중첩된 선언의 부분으로 나타날 수 있습니다. 중첩된 선언에 대한 제너릭 where
절은 둘러싸는 선언의 타입 파라미터를 참조할 수 있습니다; 그러나 where
절의 요구사항은 작성된 선언에만 적용됩니다.where
절을 가지고 있으면 두 절의 요구사항은 결합됩니다. 아래 예제에서 startsWithZero()
는 Element
가 SomeProtocol
과 Numeric
모두 준수하는 경우에만 가능합니다.GRAMMAR OF A GENERIC PARAMETER CLAUSE generic-parameter-clause →<
generic-parameter-list>
generic-parameter-list → generic-parameter | generic-parameter,
generic-parameter-list generic-parameter → type-name generic-parameter → type-name:
type-identifier generic-parameter → type-name:
protocol-composition-type generic-where-clause →where
requirement-list requirement-list → requirement | requirement,
requirement-list requirement → conformance-requirement | same-type-requirement conformance-requirement → type-identifier:
type-identifier conformance-requirement → type-identifier:
protocol-composition-type same-type-requirement → type-identifier==
type
Dictionary
타입의 특수한 버전인 Dictionary<String, Int>
는 제너릭 파라미터 Key: Hashable
과 Value
를 구체적인 타입 인수 String
과 Int
로 대체하여 구성됩니다. 각 타입 인수는 제너릭 where
절에 지정된 추가 요구사항을 포함하여 대체하는 제너릭 파라미터의 모든 제약사항을 충족해야 합니다. 위의 예제에서 Key
타입 파라미터는 Hashable
프로토콜을 준수하도록 제한되므로 String
도 Hashable
프로토콜을 준수해야 합니다.Array<Int>
은 Array<Element>
배열의 특별한 버전으로 타입 파라미터 Element
를 대체할 수 있습니다.GRAMMAR OF A GENERIC ARGUMENT CLAUSE generic-argument-clause →<
generic-argument-list>
generic-argument-list → generic-argument | generic-argument,
generic-argument-list generic-argument → type