iOS

    TCA) Store vs ViewStore

    최근 TCA와 SwiftUI를 시작하면서 공부할게 너무 많아졌다.. 한번 끄적거려 보자.. TCA를 사용하면 항상 View에 Store, ViewStore를 사용하는데, 이 차이는 뭘까. Store의 구현부를 보면 public final class Store 로 선언되어 있고, ViewStore의 구현부는 public final class ViewStore: ObservableObject 로 선언되어 있다. 일단 이름만으로 예측해보면, View가 prefix로 붙어있고, Combine의 ObservableOject를 채택하고 있다. 따라서 “Store를 관찰하면서 View를 변경하겠다” 라는 생각이 든다. Store, ViewStore를 사용하는 부분을 보면, 1. struct FeatureView: V..

    Storyboard 에서 Generic Type 의존성 주입하기 2

    기존 Storyboard 에서 Generic Type 의존성 주입하기에서 큰 이슈가 있었다. 바로 iOS 13 미만 버젼에서 IBOutlet이 연결되지 않아서 앱이 크래쉬가 나는 이슈가 났음.. import UIKit typealias UIStoryboard = _DependencyInjectionStoryboard final class _DependencyInjectionStoryboard { private let storyBoard: UIKit.UIStoryboard init(name: String, bundle: Bundle?) { self.storyBoard = UIKit.UIStoryboard.init( name: name, bundle: bundle ) } func instantiateView..

    Custom Horizontal FlowLayout

    import UIKit class ViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var collectionViewHeight: NSLayoutConstraint! let dataSource: [String] = ["아이템", "아이템111", "아이템”222", "아이템3333", "아이템1111", "아이템3123123", "아이템123123", "아이템", "아이템12313", "아이템222", "아이템31231", "아이템23333", "아이템", "아이템232332", "아이템123123", "아이템66", "아이템2", "아이템", "아이템123123", "아..

    RxNimble + Quick Unit Test

    Quick BDD(Behavior-Driven Development)를 위한 프레임워크 각 클로져 단위 마다 descirption을 묶어서 사용하기 때문에 가독성이 좋음 Given(준비) - When(실행) - then(검증) descibe(Given) → context(When) → it(Then) 순으로 구성 beforeEach 초기화 블록을 통해 it 이 실행 되기 이전의 클로져에 있는 beforeEach 블록들을 순차적으로 실행함 afterEach 를 통해 it 블록이 실행 된 이후 해야할 초기화 작업을 할 수 있음. beforeEach 를 통해 각 it 테스트는 ‘순수한' 상태에서 시작하는 것이 좋음 각 it를 테스트 하고 ViewModel의 초기화, 동작이 진행된 코드를 다시 사용해서 테스트 ..