🔥 제네릭 서브스크립트

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

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

  1. 꺾쇠 괄호 안에 선언된 제네릭 매개변수 Indices는 Swift 표준 라이브러리의 Sequence 프로토콜을 준수하는 타입이어야 해요.
  2. 서브스크립트는 Indices 타입의 인스턴스 indices를 유일한 매개변수로 받아요.
  3. 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에 저장되는 것을 확인할 수 있습니다.

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