본문 바로가기

전체 글

(18)
Literal Initializer 만들기 최근 공부하다가 Literal이라는 것을 접하게 되었고 이 Literal이 Swift에서 어떻게 쓰이는 지 알고 적용해보고 싶었다! Literal Initializer 만들기 Literal이란 소스코드의 어떤 값을 대표하는 것입니다. 예를 들어 0은 Integer, 0.0은 Floating-Point, "AAA"는 String과 같이 어떤 값이 주어지면 그 값을 대표하는 것이 Literal입니다. 이 Literal은 Swift에서 Protocol로 제공되고 있습니다. Literal Protocol Integer ExpressibleByIntegerLiteral Floating-Point ExpressibleByFloatLiteral String ExpressibleByStringLiteral Extend..
NSCache로 Image Cache를 구현해보자! 보통 URL를 통한 Image Download 작업을 할 때, Kingfisher 라이브러리를 사용한다. 이 때, Kingfisher는 Cache도 지원해주는데 이 Cache를 NSCache로 직접 만들어보자! NSCache로 Image Cache를 구현해보자! 먼저 iOS에는 NSCache라는 것을 지원해준다. Apple 공식 Document에서도 찾아볼 수 있는데 아래와 같다. 설명을 읽어보면 key-value로 Cache를 지원하고 Generic Class이기 때문에 각 Type을 지정해줘야 하는 것 같다. 먼저, Cache없이 url로 이미지를 받아오는 작업을 해보자! 이미지는 아이언맨과 캡틴아메리카로 해봤습니다...ㅎㅎ "Image Download" 버튼을 누르면 URLSession을 이용하여 ..
UICollectionViewCell의 LifeCycle과 PreFetching UIViewControleller의 LifeCyle은 한 번 정리했었지만 자주 사용하는 UICollectionViewCell이나 UITableViewCell의 LifeCycle은 인지하고 않고 있어서 한 번 정리해야 할 것 같다. UICollectionViewCell의 LifeCycle과 PreFetching View와 관련된 작업을 할 때, LifeCycle을 알아야 더 훌륭하게 작업을 할 수가 있다. UIViewController는 처음 공부할 때 부터 인지하고 있어서 괜찮았지만 UICollectionViewCell같은 경우는 단순하게 Reusable만 된다는 것을 알고 LifeCycle을 공부하진 않았다. 단순히 deququeReusableCell로 cell을 만들고, 재사용을 위해서 ReuseQu..
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 같은 ..