일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Clean Code
- MVVM
- 클린 코드
- clean architecture
- 리팩토링
- Refactoring
- RxCocoa
- UITextView
- rxswift
- SWIFT
- swiftUI
- 리펙토링
- Observable
- 애니메이션
- 스위프트
- Xcode
- combine
- 리펙터링
- HIG
- map
- Human interface guide
- ios
- uitableview
- collectionview
- UICollectionView
- tableView
- uiscrollview
- Protocol
- swift documentation
- ribs
- Today
- Total
목록Protocol (15)
김종권의 iOS 앱 개발 알아가기
기초) DI (Dependency Injection)이란? DI란, 특정 기능을 사용하려고 할 때, 특정 기능에 대한 구현체를 사용하는쪽에서 주입해주어서 사용하는쪽에 구현체를 위임하는 것 (SOLID원칙 중 의존성 역전, DIP 원칙에 해당) 느슨한 결합도 testable한 코드 ex) 사용하는쪽에서 구현체를 결정하는 DI 형태 코드에서 운동과 관련된 일을 하는 Workoutable이라는 기능이 필요할 때, 프로토콜로 선언 class ViewController: UIViewController { var workout: Workoutable init(workout: Workoutable) { self.workout = workout super.init(nibName: nil, bundle: nil) } r..
protocol 준수하는 모델 넘기기 ViewController에서 viewModel로 SomeModelable을 준수하는 모델을 넘겨야 하는 경우? 단, SomeModelable을 준수하는 모델은 여기서밖에 사용하지 않음 protocol SomeModelable { var a: Int { get } var b: String { get } } class ViewController: UIViewController { let viewModel = ViewModel() override func viewDidLoad() { super.viewDidLoad() viewModel.configure(model: /*여기!*/) } } class ViewModel { func configure(model: SomeMo..
1. 추상화의 개념과 목적 2. 제네릭스로 추상화하기 3. 프로토콜에 제네릭스 사용하는 추상화 이해하기
nested protocol swift 5.10 아래 버전에서는 아래처럼 protocol을 struct/class/enum/actor/function 하위에 정의가 불가능 swift 5.10 이전에서 Delegate protocol을 만들려고하면 아래처럼 외부에 Delegate를 정의하고, 안에서도 접근할때 fullName으로 접근해야함 (TableView안에 protocol 정의가 가능하면 외부에서는 TableView.Delegate로 접근이 가능하고, 내부에서는 단순히Delegate 이름으로만 접근이 가능) class TableView: UIView { weak var delegate: TableViewDelegate } protocol TableViewDelegate { } swift 5.10부터는..
프로토콜로 리펙토링하는 아이디어 리펙토링의 핵심: 기존에 있는 코드에 영향을 최소화 하는 것 리펙토링 대상에 해당하는 interface들을 모두 protocol을 만들어서 선언 기존에 있던 리펙토링 대상의 인스턴스에 protocol을 타입을 따르고 기존 구현체를 대입 protocol을 준수하는 새로운 구현체를 구현하여 기존것과 변경 리펙토링 전 코드 예제 ex) LogModel이라는 기능이 있고 이 모델을 2곳 이상에서 사용하고 있을때 LogModel내부 코드를 리펙토링 하고 싶은 경우? LogModel은 UI를 탭한 카운트를 기록하는 모델 struct LogModel { private var countOfTap = 0 private var latestDate: Date? mutating func ad..
Custom View 구현 시 프로토콜을 사용하면 좋은 이유 보통 커스텀 뷰를 구현하면 사용하는쪽에서 가져다 쓰는데, 사용하는곳이 여러곳이면 이 커스텀 뷰를 수정할때 여러곳을 고려해야하여 수정이 어려움이 존재 프로토콜을 사용한다면? 구현체의 의존성을 사용하는쪽에 두지 않는것이 가장 큰 의미, DIP(Dependency Inversion Principle) 사용하는쪽에서는 Interface에만 의존하고 있기 때문에 구현체에 여러가지 변화를 주더라도 유연한 구조 유지가 가능 ex) 커스텀 뷰가 공통 뷰이고 이 뷰가 Swift에서 SwiftUI로 넘어갈 때 역시도 protocol로만 외부에게 노출했으면 유연하게 수정이 가능 protocol로 커스텀 뷰 구현하기 커스텀 버튼을 만든다고 했을 때, UIView로 ..
Protocol 프로퍼티 치환 일반적으로 protocol에서 프로퍼티를 선언하면, 이 프로토콜을 준수하는 쪽에서 똑같은 프로퍼티 이름으로만 접근이 가능 protocol SomeProtocol { var myProperty: Int { get } } struct SomeStruct: SomeProtocol { var myProperty: Int } 만약 프로퍼티 이름이 다르면 컴파일 에러 발생) @_implements를 사용하면 다른 이름으로 사용이 가능 @_implements 키워드 @_implements(ProtocolName, propertyName)으로 프로퍼티 위에 선언하여 사용 struct SomeStruct2: SomeProtocol { @_implements(SomeProtocol, myPr..
공통 모델이 있을 때 리펙토링 방법 보통 공통 모델에서 특정 프로퍼티만 필요한 경우, 따로 DTO를 만들어서 convert 로직을 만드는데, protocol을 활용하면 간결하게 해결이 가능 ex) 공통 모델 CommonModel이 있고, 각 모델에서 필요한 모델도 각각 있어서 convert해서 쓰는 패턴 공통 모델이 CommonModel처럼 있는 경우 struct CommonModel { let age: Int var name: String let date: String let visited: Bool let imageData: Data var message: String } VC2, VC3에서 필요한 모델이 있어서 struct로 만들고 이걸 CommonModel에서 convert해서 쓰는 방식 stru..