제네릭 서브스크립트와 확장
서브스크립트와 확장에 제약 조건을 적용합니다.
제네릭 서브스크립트와 확장은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
제네릭 서브스크립트
서브스크립트도 제네릭으로 만들 수 있으며, 바깥 타입과 독립적인 자체 타입 매개변수를 받을 수 있습니다. 따라서 하나의 서브스크립트로 여러 입력 타입을 처리할 수 있습니다.
struct Lookup {
let data = [1, 2, 3, 4, 5]
subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
print(Lookup()[indices: [0, 2, 4]])제네릭 서브스크립트가 필요한 이유
동일한 서브스크립트가 모든 Sequence의 Int 인덱스를 받을 수 있으므로 Array, Set, Range 중 어떤 타입의 인덱스든 전달할 수 있습니다.
struct Lookup {
let data = [10, 20, 30, 40]
subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])제약 조건이 있는 확장
extension ... where는 제약 조건이 충족될 때만 존재하는 구성원을 추가합니다. 일치하는 제네릭 인수가 사용된 경우에만 해당 타입에 나타납니다.
extension Array where Element: Numeric {
func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())특정 요소 타입에 대한 확장
where Element == String을 사용하면 문자열 배열에만 문자열 전용 도우미를 추가할 수 있습니다.
extension Array where Element == String {
func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())프로토콜을 사용하는 제약 조건부 확장
요소가 사용자 정의 프로토콜을 준수할 때 동작을 추가합니다.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)옵셔널을 반환하는 제네릭 서브스크립트
서브스크립트는 제네릭으로 만들 수 있고 옵셔널을 반환할 수도 있습니다. 예를 들어 컬렉션에 안전하게 인덱스로 접근할 때 사용할 수 있습니다.
extension Array {
subscript(safe i: Int) -> Element? {
indices.contains(i) ? self[i] : nil
}
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)딕셔너리의 제네릭 서브스크립트
제네릭 서브스크립트는 키의 시퀀스를 받아 해당하는 값들을 반환할 수 있습니다.
extension Dictionary {
subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
ks.compactMap { self[$0] }
}
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())Self에 대한 조건 절과 결합하기
제네릭 타입의 확장에서 래핑된 타입에 제약 조건을 지정하여 용도에 맞춘 API를 노출할 수 있습니다.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)여러 매개변수를 사용하는 제네릭 서브스크립트
서브스크립트는 여러 인수와 자체 타입 매개변수를 함께 받을 수 있습니다.
struct Grid {
let rows = [[1, 2], [3, 4]]
subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])읽기 전용과 읽기-쓰기
프로퍼티와 마찬가지로 서브스크립트에도 get만 지정하거나, 변경을 위해 get과 set을 모두 지정할 수 있습니다.
struct Pad {
var values = [0, 0, 0]
subscript(i: Int) -> Int {
get { values[i] }
set { values[i] = newValue }
}
}
var p = Pad(); p[1] = 7
print(p.values)종합하기
제네릭 서브스크립트와 제약 조건부 확장을 함께 사용하면 어떤 요소 타입이나 인수 타입이 사용되더라도 적응할 수 있는 표현력 높고 타입 안전한 API를 만들 수 있습니다.
extension Array where Element: Comparable {
subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])빠른 확인
제네릭 서브스크립트와 제약 조건부 확장에 대한 이해도를 확인해 보십시오.
복습
제네릭 서브스크립트는 자체 타입 매개변수와 where 절을 선언하므로 하나의 서브스크립트에서 여러 입력 타입을 받을 수 있습니다. 제약 조건부 확장(where Element: ... 또는 == ...)은 조건이 충족될 때만 구성원을 추가합니다. 두 기능을 함께 사용하면 타입 안전하고 유연한 API를 만들 수 있습니다.
자주 묻는 질문
“제네릭 서브스크립트와 확장” 강의는 무료인가요?
네 — “제네릭 서브스크립트와 확장” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“제네릭 서브스크립트와 확장”에서 뭘 배우나요?
서브스크립트와 확장에 제약 조건을 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“제네릭 서브스크립트와 확장” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 형식 매개변수 제약 조건
- 함수의 where 절
- 연관 형식 제약하기
- 제네릭 서브스크립트와 확장