🔥 제네릭 서브스크립트
248자
4분
Swift에서는 서브스크립트(Subscript)도 제네릭(Generic)으로 선언할 수 있답니다. 제네릭 서브스크립트를 선언할 때는 subscript
키워드 뒤에 꺾쇠 괄호(<>
)로 플레이스홀더 타입 이름을 감싸주면 되고, 서브스크립트의 본문 시작 중괄호({
) 바로 앞에 where
절을 사용하여 제약 조건을 명시해 줄 수 있어요. 아래 코드를 함께 살펴보시죠!
extension Container { subscript<Indices: Sequence>(indices: Indices) -> [Item] where Indices.Iterator.Element == Int { var result: [Item] = [] for index in indices { result.append(self[index]) } return result } }
swift
이 코드는 Container
프로토콜을 확장하여 제네릭 서브스크립트를 추가하는 예시랍니다. 이 서브스크립트는 인덱스의 시퀀스를 받아서 해당 인덱스에 있는 아이템들의 배열을 반환하는 역할을 해요.
제네릭 서브스크립트에 사용된 제약 조건들을 하나씩 파헤쳐 보겠습니다:
- 꺾쇠 괄호 안에 선언된 제네릭 매개변수
Indices
는 Swift 표준 라이브러리의Sequence
프로토콜을 준수하는 타입이어야 해요. - 서브스크립트는
Indices
타입의 인스턴스indices
를 유일한 매개변수로 받아요. where
절을 통해 시퀀스의 이터레이터가Int
타입의 요소를 순회해야 함을 명시하고 있어요. 이는 시퀀스의 인덱스들이 컨테이너에서 사용되는 인덱스와 동일한 타입임을 보장하지요.
이 제약 조건들을 종합해 보면, indices
매개변수로 전달되는 값은 정수형 시퀀스라는 것을 알 수 있답니다.
실제로 이 제네릭 서브스크립트를 사용하는 코드를 작성해 볼까요?
let numbers = [10, 20, 30, 40, 50] let indices = [1, 3] let selectedNumbers = numbers[indices] print(selectedNumbers) // [20, 40]
swift
numbers
배열에서 indices
로 지정한 인덱스 1과 3에 해당하는 요소인 20과 40이 selectedNumbers
에 저장되는 것을 확인할 수 있습니다.
이처럼 제네릭 서브스크립트를 활용하면 다양한 시퀀스 타입을 인덱스로 받아들일 수 있게 되어 코드의 유연성과 재사용성이 높아지게 됩니다. 컨테이너 타입에 따라 적절한 제약 조건을 설정하여 제네릭 서브스크립트를 구현해 보시는 것은 어떨까요? 제네릭의 강력함을 체감하실 수 있을 거예요!