연관 형식 제약하기
제네릭 문맥에서 연관 형식의 범위를 제한합니다.
연관 형식 제약하기은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
연관 타입 복습
프로토콜은 associatedtype을 사용하여 연관 타입을 선언할 수 있습니다. 이는 프로토콜을 준수하는 타입이 실제 타입으로 채우는 자리 표시자입니다. 컨테이너 프로토콜의 Element가 대표적인 예입니다.
protocol Container {
associatedtype Item
var count: Int { get }
func item(at i: Int) -> Item
}구체 타입으로 준수하기
프로토콜을 준수하는 타입은 연관 타입을 결정하며, 이 타입은 사용 방식에 따라 추론되는 경우가 많습니다.
protocol Container {
associatedtype Item
func item(at i: Int) -> Item
}
struct IntBox: Container {
let values: [Int]
func item(at i: Int) -> Int { values[i] }
}
print(IntBox(values: [10, 20]).item(at: 1))연관 타입에 제약 조건 지정하기
선언부에 바로 제약 조건을 추가할 수 있습니다. associatedtype Item: Comparable은 모든 준수 타입의 항목 타입이 비교를 지원하도록 강제합니다.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [3, 1, 2]).items.sorted())제약 조건 사용하기
연관 타입에 제약 조건이 있으므로 프로토콜 확장은 해당 기능을 전제로 작성할 수 있습니다.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
extension Sorted {
var smallest: Item? { items.min() }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [5, 2, 8]).smallest!)연관 타입에 적용하는 조건 절
스위프트에서는 연관 타입에 where 절을 사용하여 다른 연관 타입이나 중첩 타입과의 관계를 지정할 수도 있습니다.
protocol Sequence2 {
associatedtype Element
associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
}다른 프로토콜로 제한하기
연관 타입이 직접 정의한 프로토콜을 준수하도록 요구하여 동작을 여러 층으로 구성할 수 있습니다.
protocol HasName { var name: String { get } }
protocol Registry {
associatedtype Entry: HasName
var entries: [Entry] { get }
}
struct User: HasName { let name: String }
struct Users: Registry { let entries: [User] }
print(Users(entries: [User(name: "Ada")]).entries[0].name)여러 연관 타입
프로토콜은 여러 연관 타입을 선언할 수 있으며, 각 타입에 독립적으로 제약 조건을 지정할 수 있습니다.
protocol Mapping {
associatedtype Key: Hashable
associatedtype Value
func value(for k: Key) -> Value?
}
struct Phonebook: Mapping {
let data: [String: Int]
func value(for k: String) -> Int? { data[k] }
}
print(Phonebook(data: ["x": 1]).value(for: "x")!)기본 연관 타입
=를 사용하여 연관 타입에 기본값을 지정할 수 있습니다. 준수 타입이 별도로 지정하지 않으면 이 기본값이 사용됩니다.
protocol Producer {
associatedtype Output = String
func make() -> Output
}
struct Hello: Producer {
func make() -> String { "hi" }
}
print(Hello().make())제약 조건으로 제네릭 알고리즘 구현하기
연관 타입에 제약 조건이 있으면 프로토콜 확장에서 모든 준수 타입이 공유하는 실제 알고리즘을 구현할 수 있습니다.
protocol Scored {
associatedtype Score: Comparable
var scores: [Score] { get }
}
extension Scored {
var best: Score? { scores.max() }
}
struct Game: Scored { let scores: [Int] }
print(Game(scores: [10, 40, 25]).best!)확장의 동일 타입 제약 조건
프로토콜 외부에서도 프로토콜을 확장할 때 연관 타입을 더 제한할 수 있습니다.
protocol Box2 {
associatedtype Content
var content: Content { get }
}
extension Box2 where Content == Int {
var doubled: Int { content * 2 }
}
struct IB: Box2 { let content: Int }
print(IB(content: 7).doubled)왜 제약 조건을 둘까요?
연관 타입에 제약 조건을 지정하면 프로토콜을 제네릭이면서도 강력하게 유지할 수 있습니다. 이 제약 조건은 확장과 호출자가 의지할 수 있는 약속입니다.
protocol Listy {
associatedtype E: Equatable
var elements: [E] { get }
}
extension Listy {
func has(_ x: E) -> Bool { elements.contains(x) }
}
struct L: Listy { let elements: [String] }
print(L(elements: ["a", "b"]).has("b"))빠른 확인
연관 타입 제약 조건에 대한 이해도를 확인해 보십시오.
복습
연관 타입을 직접 제한하고(associatedtype Item: Comparable), where 절로 서로 연결하며, 프로토콜 준수를 요구하고, =로 기본값을 지정하고, 여러 연관 타입을 선언하고, 확장에서 더 구체적으로 제한할 수 있습니다. 제약 조건을 사용하면 프로토콜 확장에서 타입 안전성을 갖춘 공용 알고리즘을 구현할 수 있습니다.
자주 묻는 질문
“연관 형식 제약하기” 강의는 무료인가요?
네 — “연관 형식 제약하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“연관 형식 제약하기”에서 뭘 배우나요?
제네릭 문맥에서 연관 형식의 범위를 제한합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“연관 형식 제약하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 형식 매개변수 제약 조건
- 함수의 where 절
- 연관 형식 제약하기
- 제네릭 서브스크립트와 확장