전체 글
SwiftUI TCA - 3. State, Action, Reducer, Effect
TCA의 구성을 하나 씩 살펴보겠습니다. 앱의 상태 "State" State는 Reducer의 현재 상태를 갖는 구조체입니다. 쉽게 비즈니스 로직을 수행하거나 UI를 그릴 때 필요한 데이터를 소지합니다. 예를 들어 카운트를 증, 감 시키는 어플리케이션을 가정합니다 그럼 카운트를 표시하기위해 State는 다음과같이 count데이터를 소지하고 있을 것 입니다. struct CounterFeature: Reducer { struct State: Equatable { var count = 0 } ... } 여기서 State는 Equatable인데요, 그 이유는 다음과 같습니다. SwiftUI는 View의 상태가 변경되었을 때 해당 view를 자동으로 업데이트 합니다. 즉 현재 상태와 이 전 상태를 비교하여 불 ..
SwiftUI TCA - 2. 단방향 아키텍처 TCA
TCA는 단방향 아키텍처입니다. 하지만 SwiftUI는 양방향 데이터 바인딩을 지원합니다. View가 ViewModel에서 요청을 받아와서 추가작업을 해야하는 경우가 발생합니다. 이런 상황에 팀원과의 협업중 코드 작성에 유의하지 않는다면 나중에 언제 어디서 상태가 바뀌는지 알기 파악하기 어려운 문제가 생길 수 있습니다. 이와달리 TCA의 상태 변화에 대한 일관적인 가이드라인을 컴파일 단계에서부터 강제합니다. 어떠한 개발자던 TCA를 사용한다면 Action 정의, Action에대한 View에서의 .send() 를 거쳐야합니다. 이러한 규칙을 적용할 수 있습니다. TCA의 핵심은 다음과 같습니다. 1. State management(상태 관리): 상태를 공유하는 방법. 이를 통해 특정 화면에서의 상태변화를 ..
SwiftUI TCA - 1. TCA의 등장 배경
애플 생태계 개발은 주로 Swift로 많이 작성됩니다. 이렇게 작성된 코드들의 관리 방법또한 중요합니다. 3일뒤, 3주뒤, 3달뒤에 코드를 돌아볼 때 어느 파일에 어느 코드가 있을지 알아야 유지보수에 용이하기 때문입니다. 코드를 정리하고 구현하는데에는 일정한 규칙이 있습니다. 정형화된 하나의 규칙을 제안하는것 = '디자인 패턴(Design Pattern)' 정리된 코드들을 더 추상화된 비즈니스적 문제 해결 관점으로 정리하는것 = '아키텍처 패턴(Architecture Pattern)' 여기선 상태관리 및 의존성 라이브러리인 The Composable Architecture를 활용한 아키텍쳐 패턴에 대해 정리합니다. 기존의 패턴 Swift, SwiftUI로 선언형 UI를 구현하는 환경에서는 MVVM패턴이 ..
SwiftUI - @ObservableObject, @ObservedObject, @Published, ObjectWillChange
@ObservableObject @ObservedObject는 ObservableObject 프로토콜을 준수하는 객체를 관찰하는 뷰 내에서 사용되는 프로퍼티 래퍼입니다. ObservableObject는 Class형태만 가능합니다. Struct형태는 불가능합니다. class의 @Published 인스턴스의 변화를 감지하고 해당 인스턴스가 변화할 때 마다 뷰를 업데이트합니다. ObservableObject 프로토콜을 준수하면 objectWillChange프로퍼티를 사용할 수 있습니다. * @Published 어노테이션은 값이 변동되었을때 바로 View에게 즉각적으로 알려주는 어노테이션입니다. ex) class MyViewModel: ObservableObject { @Published var score =..
SwftUI - @State, @Binding
@State와 @Binding은 모두 데이터의 서유와 공유 방식을 다루는 두가지 property wrapper입니다. @State 뷰 내에서 private 상태를 관리하기위한 프로퍼티 래퍼입니다. 뷰 내부 상태를 저장하기위해 사용됩니다. 해당 프로퍼티 래퍼로 생성된 변수의 상태 변경시 뷰가 자동으로 업데이트되게합니다. ValueType으로 Struct, Enum 활용이 적절합니다. @State프로퍼티 값이 변경될 때 마다 뷰를 다시 랜더링합니다. 최신 상태를 유지하도록. 여기서 $가 등장합니다. Toggle의 isOn값은 Binding 값을 받으므로 $를 붙혀 초기화합니다. isOn -> Bool값 $isOn -> Binding @Binding 부모뷰로부터 전달받은 상태 또는 다른뷰와의 상태를 공유하기위..
PropertyWrapper의 projectedValue
프로퍼티래퍼에대한 정보는 아래 포스팅에 정리되어있습니다. https://clamp-coding.tistory.com/396 projectedValue SwiftUI에서 @State, @Binding, @Published등의 프로퍼티 래퍼들은 각각의 *projected value(투영값)을 가집니다. 이 투영값은 프로퍼티 래퍼가 제공하는 추가 기능에 접근할 수 있도록 해주는데, 특히 바인딩이나 다른 형태의 상태관리를 위한 인터페이스 역할을 합니다. 이는 SwiftUI가 관리하는 변수의 "특별한 버전"을 의미합니다. 해당 변수를 UI컴포넌트와 연결하거나 변수의 변화를 감시하는 등의 추가적인 작업을 할 수 있게 됩니다. ProjectedValue는 해당 프로퍼티의 "추가기능"에 접근할 수 있는 방법입니다. '..
[iOS] - UICollectionView Compositional Layout
앱스토어 앱. CompositionalLayout을 사용하지 않는다면 테이블뷰 내부의 셀 내부의 컬렉션뷰 내부의 테이블뷰... 이런 복잡한 레이아웃을 보완하기위해 Compositional Layout의 등장. 전체 하나의 CollectionView로 섹션별 다양한 레이아웃을 적용 가능 구성 하나의 Layout 내부의 여러 Section이 포함되며 Section은 여러 Group을 포함한다. Group은 Item을 갖고있다. 이들의 크기를 지정해주면 된다. CollectionView의 item 사이즈를 정하는 방법(NSCollectionLayoutDimension) .absolute - 고정 크기 .estimated - 런타임에 크기가 정해지는경우(예상크기) .fractional - 비율(컨테이너에 대한 ..
[iOS] Alamofire 네트워크 레이어 설계1. 에러처리 (feat. Rx)
https://ios-development.tistory.com/731 [iOS - swift] 1. Alamofire 사용 방법 - Network Layer 구현 (Moya 프레임워크처럼 사용하는 방법) 1. Alamofire 사용 방법 - Network Layer 구현 (Moya 프레임워크처럼 사용하는 방법) 2. Alamofire 사용 방법 - 토큰 갱신 방법1 (Interceptor, adapt, retry) 3. Alamofire 사용 방법 - 토큰 갱신 방법2 (AuthenticationCredential, ios-development.tistory.com 해당 게시글을 토대로 구현해본 네트워크 레이어를 기록해봅니다. 부족한 점이 있다면 알려주시면 감사합니다. 1. 에러 처리 * HTTP통신은..
[iOS] - IntrinsicContentSize, InvalidateIntrinsicContentSize()
IntrincContentSize 본질적인 컨텐츠 크기 UILabel, UIButton을 autoLayout으로 구현할 때 Width, Height를 지정해주지 않아도 에러가 발생하지 않는 이유는 IntrinsicContentSize프로퍼티에서 컨텐츠의 크기를 계산해주기 때문입니다. UILabel, UIButton, UIProgressView 모두 루트뷰의 leading, top spacing만을 주었습니다. 모두 위치만 지정해주고 크기를 지정하지 않았습니다. UILabel, UIButton은 모두 IntrinsicContentSize프로퍼티가가 Width, Height를 계산해주어서 크기를 정할 수 있지만 UIProgressView는 IntrinsicContentSize로 크기를 알 수 없어서 에러가 ..
[iOS] - ContentSize(셀 전체) 만큼 커지는 UITableView/UICollectionView
ContentSize(셀 전체) 만큼 커지는 UITableView/UICollectionView UIButton, UILabel 처럼 contentSize만큼 intrinsicContentSize가 커지도록 적용한 커스텀 테이블뷰/ 컬렉션뷰 입니다. 리스트 전체를 한 번에 보여줘야하는 컴포넌트를 만들 때 유용하게 사용할 수 있습니다. 물론 이렇게 사용하면 재사용 하는 부분이 없기 때문에 UIStackView만을 이용해서 만들 수 있지만 변경된 새로운 값을 보여줘야 할 때 StackView는 변경점을 찾아 수정하고 전체를 업데이트 해줘야 하지만 TableView/StackView는 변경된 값을 바인딩만 시켜주면 끝이라 더 쉽고 효율적입니다, open class IntrinsicContentHeightTab..