제네릭(generic) 함수 또는 타입을 만들기 위해 꺾쇠 괄호 안에 이름을 작성한다.
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
var result = [Item]()
for _ in 0..<numberOfTimes {
result.append(item)
}
return result
}
makeArray(repeating: "knock", numberOfTimes: 4)
제네릭 형태의 함수와 메서드 뿐만 아니라 클래스, 열거형, 그리고 구조체도 만들 수 있다.
enum OptionalValue<Wrapped> {
case none
case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)
요구사항의 리스트를 지정하기 위해 본문 바로 전에 where을 사용한다.
예를 들어, 타입이 프로토콜을 구현하도록 요구하거나 두 타입이 동일하도록 요구하거나 클래스에 특정 상위 클래스가 있어야 한다.
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool where T.Element: Equatable, T.Element == U.Element {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
anyCommonElements([1, 2, 3], [3])
<T: Equatable>을 작성하는 것은 <T> ... where T: Equatable을 작성하는 것과 같다.