🔥 제네릭 서브스크립트

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 영상

채널 보기
Trie 자료구조 파이썬 구현: Search와 Starts With 연산 | Trie 자료구조 이야기
Trie 자료구조 완전 정복 - 개념부터 시각화까지 | Trie 자료구조 이야기
스칼라 곱셈과 내적의 기하학적 의미 | 선형대수학
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
마지막편, 트라이 노드를 50% 이상 줄이는 방법? 압축 트라이 성능 분석 | Trie 자료구조 이야기
마지막편, 10억 개 데이터 검색이 0.3ms면 끝나는 이유와 LSM-Tree의 등장
트라이(Trie)에서 단어를 삭제하는 방법 | Trie 자료구조 이야기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학