Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- Observable
- uitableview
- HIG
- Clean Code
- Protocol
- 스위프트
- UITextView
- map
- swiftUI
- ios
- RxCocoa
- UICollectionView
- 리펙터링
- Refactoring
- 클린 코드
- tableView
- combine
- collectionview
- SWIFT
- Human interface guide
- 리팩토링
- MVVM
- ribs
- 애니메이션
- rxswift
- uiscrollview
- swift documentation
- clean architecture
- 리펙토링
- Xcode
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 3. 추상화 - 프로토콜에 제네릭스 사용하는 추상화 이해하기 본문
* 추상화하기 목차: https://ios-development.tistory.com/1627
프로토콜과 제네릭스 사용하는 목적 파악하기
- 프로토콜 사용 목적?
- protocol을 타입(existential type)으로하고 구현체를 assign하는 패턴으로하면 구현체의 변경할 때 유연성이 증가
- 구현체에는 여러 구현 코드가 섞여서 정말 사용하는쪽에서만 필요한 인터페이스만 보려면 가독성이 떨어지지만 protocol을 타입으로한다면 사용하는 쪽에서 필요한 스펙 파악이 용이
- 제네릭스 사용 목적
- 코드의 재사용성
- 중복 제거
포로토콜에 제네릭스 사용의 이해
- 프로토콜에는 associated type 키워드를 사용하여 제네릭스 사용이 가능
ex) cell타입을 추상화하기 위해서 protocol을 사용했고 이 protocol에는 Cell에서 필요한 데이터 타입인 D를 정의
(전체 코드는 이전 포스팅 글 참고)
protocol TableViewCellable where Self: UITableViewCell {
associatedtype D
func configure(_ value: D)
}
- 프로토콜과 제네릭스 사용에 관한 이해
- 프로토콜에 대한 타입을 사용한다면 그 타입을 conform하는 별도의 타입을 정의해야함
- 제네릭스를 사용한다면 그 타입을 conform하는 별도의 타입이 불필요
- 즉 요구사항에 맞추어서 사용하는쪽에서 특정 기능을 구현해야하는 경우는 protocol로 추상화하고, 특정 요구사항 없이 단순히 추상화하고 싶은경우 제네릭스로 표현하는 것
cf) 제네릭스도 프로토콜처럼 특정 타입만 가능하다는 Type Constraint는 가능
// Type Constraint 예시
// 코드 출처: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/#Type-Constraint-Syntax
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}
예를 통해서 protocol + generics 이해하기
protocol TableViewCellable where Self: UITableViewCell {
associatedtype D
func configure(_ value: D)
}
- protocol 추상화
- 커스텀 셀에서는 항상 configure를 통해 데이터를 갱신해주는 메서드가 있어야하므로 사용하는쪽에 configure 메서드를 강제화시키는 추상화가 필요하므로 protocol을 사용
- protocol에 generics를 사용하여 추상화
- associatedtype으로 데이터 타입을 추상화했는데, 사용하는쪽에서 데이터 타입을 사용할때 특별한 제약사항이 없어도 되므로 제네릭스로 선언한 것
protocol TableViewCellable where Self: UITableViewCell {
associatedtype D
func configure(_ value: D)
}
- protocol과 generics 사용 정리
- protocol 추상화: 사용하는쪽에서 특별한 제약사항이나 필수 기능을 가지고 있어야하는 경우
- generics 추상화: 사용하는쪽에서 특별한 제약사항 없이 단순히 타입만 나타내고 싶은 경우
* 참고
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] Optional Operator (옵셔널 프로퍼티 연산) (0) | 2024.02.05 |
---|---|
[iOS - swift] any vs some 키워드 (dynamic dispatch, static dispatch, type erase) (1) | 2024.02.02 |
[iOS - swift] 2. 추상화 - 제네릭스로 추상화하기 (#GenericTableView) (2) | 2024.01.31 |
[iOS - swift] protocol에 사용되는 any 키워드 개념 (existential any, existential type) (2) | 2024.01.30 |
[iOS - swift] 1. 추상화 - 개념과 목적 (1) | 2024.01.29 |
Comments