🔥 제네릭 서브스크립트

248자
4분

Swift에서는 서브스크립트(Subscript)도 제네릭(Generic)으로 선언할 수 있답니다. 제네릭 서브스크립트를 선언할 때는 subscript 키워드 뒤에 꺾쇠 괄호(<>)로 플레이스홀더 타입 이름을 감싸주면 되고, 서브스크립트의 본문 시작 중괄호({) 바로 앞에 where 절을 사용하여 제약 조건을 명시해 줄 수 있어요. 아래 코드를 함께 살펴보시죠!

swift
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
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
    }
}

이 코드는 Container 프로토콜을 확장하여 제네릭 서브스크립트를 추가하는 예시랍니다. 이 서브스크립트는 인덱스의 시퀀스를 받아서 해당 인덱스에 있는 아이템들의 배열을 반환하는 역할을 해요.

제네릭 서브스크립트에 사용된 제약 조건들을 하나씩 파헤쳐 보겠습니다:

  1. 꺾쇠 괄호 안에 선언된 제네릭 매개변수 Indices는 Swift 표준 라이브러리의 Sequence 프로토콜을 준수하는 타입이어야 해요.
  2. 서브스크립트는 Indices 타입의 인스턴스 indices를 유일한 매개변수로 받아요.
  3. where 절을 통해 시퀀스의 이터레이터가 Int 타입의 요소를 순회해야 함을 명시하고 있어요. 이는 시퀀스의 인덱스들이 컨테이너에서 사용되는 인덱스와 동일한 타입임을 보장하지요.

이 제약 조건들을 종합해 보면, indices 매개변수로 전달되는 값은 정수형 시퀀스라는 것을 알 수 있답니다.

실제로 이 제네릭 서브스크립트를 사용하는 코드를 작성해 볼까요?

swift
let numbers = [10, 20, 30, 40, 50]
let indices = [1, 3]
 
let selectedNumbers = numbers[indices]
print(selectedNumbers) // [20, 40]
swift
let numbers = [10, 20, 30, 40, 50]
let indices = [1, 3]
 
let selectedNumbers = numbers[indices]
print(selectedNumbers) // [20, 40]

numbers 배열에서 indices로 지정한 인덱스 1과 3에 해당하는 요소인 20과 40이 selectedNumbers에 저장되는 것을 확인할 수 있습니다.

이처럼 제네릭 서브스크립트를 활용하면 다양한 시퀀스 타입을 인덱스로 받아들일 수 있게 되어 코드의 유연성과 재사용성이 높아지게 됩니다. 컨테이너 타입에 따라 적절한 제약 조건을 설정하여 제네릭 서브스크립트를 구현해 보시는 것은 어떨까요? 제네릭의 강력함을 체감하실 수 있을 거예요!

YouTube 영상

채널 보기
Writer 펑터와 클라이슬리 카테고리 | 프로그래머를 위한 카테고리 이론
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
매번 ValidationPipe 복붙하세요? NestJS 전역 파이프로 한 번에 해결하기 | NestJS 가이드
Product와 Coproduct가 Bifunctor인 이유 | 프로그래머를 위한 카테고리 이론
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
Const 펑터 - 아무것도 안 하는 펑터가 필요한 이유 | 프로그래머를 위한 카테고리 이론
class-validator 와 DTO | NestJS 가이드
NestJS 필터 바인딩 - Method, Controller, Global Scope 비교 | NestJS 가이드