20220214 iOS 일일 개발일지 === [TOC] ###### tags: `develop`, `20220214` - 설정 뷰 구성하기. - 정보 관련 뷰 - 일반 - 로그인 정보 - 주소록 - 결제 정보 X - 판매 정산 계좌 X - 알림 X - 로그아웃 ( API 연결 -> KeyChain에서 해당 AccessToken, RefreshToken 제거 후 첫 번째 탭으로 이동하도록 함.) - 상품 뷰 - 찜 기능 구현 - 찜 모달 띄우기 - 하단 클릭 바 테두리 그림자 넣기 - 차트 뷰 구현 필요함. ### 수직 확장과 수평 확장에 대한 생각 ###### tags: `opinion` ### 상위 클래스 상속을 활용한 수직 확장 vs 프로토콜을 활용한 수평 확장 뷰 내부 구성 요소가 많음에 따라 해당 뷰들을 나누는 노력을 했음. 코드를 활용해 뷰를 작성하는 과정에서 일관된 흐름을 가져가기 위한 시도를 함. 의미적으로도 일관된 면에서도 프로토콜의 활용이 더 의미가 있지 않을까 생각했다. ```swift= class BaseView: UIView { override init(frame: CGRect) { super.init(frame: frame) applyViewSettings() } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension BaseView { func buildHierarchy() { } func setupConstraints() { } func viewConfigure() { } func applyViewSettings() { buildHierarchy() setupConstraints() viewConfigure() } } ``` ```swift= protocol ViewConfiguration { func buildHierarchy() { } func setupConstraints() { } func viewConfigure() { } } extenion ViewConfiguration { func applyViewSettings() { buildHierarchy() setupConstraints() viewConfigure() } } class CustomView: UIView { override init(frame: CGRect) { super.init(frame: frame) applyViewSettings() } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension CustomView: ViewConfiguration { func buildHierarchy() { } func setupConstraints() { } func viewConfigure() { } } ```