본문 바로가기

2019/04

(6)
flatMap() 정리하기. map(), compactMap() 과의 차이 Swift의 고차함수 중 flatMap()이라는 함수가 있다. 이 함수를 공부하면서 비슷한 이름인 map(), compactMap()과 어떤 차이가 있는지도 정리해야겠다. flatMap() 정리하기. map(), compactMap() 과의 차이 flatMap이라는 네이밍은 flatten(평평하게 하다) + map(대응하다)가 합쳐진 의미입니다. 그래서 map의 기능을 하지만 flatten의 속성이 더해진거라고 이해할 수 있겠네요. flatMap()은 3가지 기능이 있습니다. non-nil인 결과들을 가지는 배열을 리턴 주어진 Sequence내의 요소들을 하나의 배열로써 리턴 주어진 Optional이 not-nil인지 판단 후 unwrapping하여 closure 파라미터로 전달 위의 공식문서는 아래에 ..
Content hugging vs Compression resistance 차이점 알기! iOS의 AutoLayout Priority 중, Content hugging과 Compression resistance가 있습니다. 아직까지 이 둘을 적용해본적은 없지만 둘이 어떤 것이고 차이점을 알아야 할 것 같아서 정리하려고 합니다. Content hugging vs Compression resistance 차이점 알기 먼저 두 Priority를 알기 전에 intrinsicContentSize를 알고 넘어가야 합니다. 설명에도 나와있지만 view 자체의 본질의 크기입니다. 이 크기가 존재함으로써 UILabel, UIButton, UISwitch 등등 기본적으로 제공되는 view들이 width와 height를 가질 수 있습니다. 이걸 왜 알아야하나?! 바로 앞선 두 Priority가 이 intrins..
setNeedsLayout() vs layoutIfNeeded 차이점 View의 layout을 갱신시키는 메소드들 중 setNeedsLayout()와 layoutIfNeeded()의 차이점을 자세히 몰랐는데 한 번 정리할 필요가 있다고 생각되어 공식문서를 보며 공부해야겠다! setNeedsLayout() vs layoutIfNeeded 차이점 두 메소드의 차이점을 알기전에 먼저 main run loop라는 것을 알아야 합니다. iOS에는 main run loop라는 것이 존재합니다. main run loop동안에 application은 사용자의 이벤트를 받아들이고 개발자가 짜놓은 코드에 따라 적절한 response를 취해줍니다. response가 다 취해지고 다시 main loop에 return이 되면 이제 update cycle로 진입하게 됩니다. update cycle..
RxSwift, Input과 Output으로 MVVM패턴 적용하기 RxSwift를 공부하면서 앱을 만들면서 MVVM패턴을 도전해보았습니다. 하지만 개발하면서 뭔가 MVVM답지 않게 프로그래밍한다고 느껴서 좀 더 찾아본 결과 Input, Output을 활용한 MVVM구조가 있어서 바로 적용해보았습니다 :) RxSwift, Input과 Output으로 MVVM패턴 적용하기 github에서 많은 MVVM-Rx 예제들을 보면서 첫 틀을 갖추고 시작하여 많이 벗어나는 경우는 없었지만 이런 경우에는 살짝 애매했습니다. Button Tap -> Bind to ViewModel.buttonDidTapped -> Business Logic in ViewModel -> Subscribe ViewModel.result in View -> Make event depends on result..
Swinject로 DI(Dependency Injection)패턴 적용하기 DI에 대해선 많이 들어봤지만 적용은 안하다가 이번 프로젝트를 진행하면서 적용해야겠다는 생각이 들어서 Swift DI 라이브러리인 Swinject로 DI 패턴을 적용하게 됐다! Swinject로 DI(Dependency Injection)패턴 적용하기 DI(Dependency Injection, 의존성 주입)이란 뜻 그대로 의존 객체를 외부에서 생성하여 넘겨주는 것을 의미합니다. 아래와 같은 상황이 있다고 생각해봅시다. // Case 1 class A { var object = B() init() { } } class B { } // Case 2 class A { var object: B init(object: B) { self.object = object } } class B { } Case 1 같은 ..
RxSwift, Network Error 처리하기 RxSwift에서 networking을 주로 Single객체로 처리한다. 이 때, error가 발생할 경우 single(.error(error))로 이벤트를 처리하면 해당 Stream이 종료된다. 이럴 경우 enum을 활용하여 error를 처리해보자! RxSwift, Network Error 처리하기 Rx에서 Observable은 이벤트가 Complete되거나 Error가 발생될 경우 해당 Stream이 종료된다. 그래서 networking에서 error를 그대로 onError에 담아서 보내면 해당 Observable과 연결되어 있는 Stream이 전부 종료되버린다. 이렇게 되면 다음 이벤트를 처리할 수 없으므로 아래와 같이 enum을 활용하여 networking 결과를 리턴하자. // Networkin..