Topic

Swift

A collection of 12 issues

타입을 모를때 디코딩 처리하기

사내 프로젝트에서 사용자 이벤트 추적을 위해 Amplitude를 사용하는데, Amplitude에서는 이벤트 키와 같이 properties를 같이 로깅할 수 있다. 이때 properties의 타입이 [String: Any]인데, 서버사이드에서 이미 렌더링하는 값들이 있다보니 properties에서 요구하는 원본값들을 가져오기 어려웠고, 결국 서버에서 로깅을 위한 객체를 내려주기로 했다. 따라서 오브젝트를 [String: Any]로 바꿔주어야 한다. 그런데 오브젝트 안이
4 min read

SwiftUI-MVVM

SwiftUI 도입 요즘 프로젝트에 SwiftUI를 도입하면서 어떤 아키텍쳐가 좋을지 고민하고 있다. 공부하다 보니 MVVM 얘기가 많았는데, 보통 많은 iOS 개발자들이 MVVM으로 구현하고 있으므로 SwiftUI에서 동일하게 적용하도록 많이 노력한 것 같다는 생각을 했다. 주로 ObservableObject로 VM을 주입받아서 뷰를 바인딩하는 느낌이었다. 그리고 MVVM View가 VM을 가지고 있는데 왜 MVVM-VM을 만드냐는 얘기가 인상적이었다.
5 min read

Swift Concurrency

Continuations Swift Concurrency를 적용하게 되면 연관된 모든 작업들이 전부 async 함수로 선언되어야 사용할 수 있게 된다. 보통 비동기 처리를 하게 되면 RxSwift나 Combine과 같은 반응형 프레임워크를 사용하며 값 방출을 기다리거나 콜백함수를 주입해 작업순서를 조정하는데, 이런 기존 코드들이 의존성이 걸려 있거나 라이브러리 속에서 구현되어 직접 async function으로 마이그레이션하기가 난감할 때가 있다.
4 min read

UITextView 높이 계산하기

회사 프로젝트에서 기능을 구현하면서 글쓰기 창의 UITextView가 늘어나도록 설정해야 했다. UITextView는 UIScrollView를 상속하는데, 기본적으로 Intrinsic Size를 가지지 않는다. 그런데 isScrollEnabled 프로퍼티를 꺼주면 안쪽 텍스트 사이즈만큼의 Intrinsic Size를 가지게 된다. 뭔가 당연한듯 하면서도? 당연하지 않은 동작이다. 요구사항에서 일정 높이 이상일때는 글쓰기 창이 다시 스크롤 동작이 되어야 했는데, 이 타이밍을 잡기 위해서
1 min read

서버 응답에서 Double값이 NaN으로 내려올때

회사 프로젝트에서 특정 네트워크 API를 콜할 때 디코딩 오류가 나는 케이스가 있었다. 데이터 응답을 살펴보니 Double값이 들어와야 할 자리에 NaN이 떨어지고 있었다. Kotlin(서버)에서 0으로 나누기 같은 비정상 연산을 수행하면 발생할 수 있다고 한다. Swift에서는 0으로 나누기 같은 에러 발생시 그냥 터져버리는데, 언어 특성상 사칙연산이 throwable하지 않으니 ArithmeticException과 같은
2 min read

URL에 한글이 들어갈때

URL(string:) 네트워크 호출시 서버에서 URL타입을 내려줄 때 리소스 등에 종종 한글이 포함된 채로 내려주는 경우가 있다. URL은 아스키코드 기반이기 때문에 그대로 URL(string:)이 nil이 되어 버린다. 그러므로 적절하게 인코딩해주어야 하는데, String의 메소드인 addingPercentEncoding(withAllowedCharacters:)에 .urlQueryAllowed를 넣어서 인코딩하면 된다. let urlString = "https://네이버.com" let url: URL = URL(
2 min read

RxSwift

RxJava 이후 간단하게 정리 RxSwift with MVVM * 뷰에 들어가는 요소: RxCocoa 요소, UI 컨트롤들, 뷰모델 * 뷰모델에 들어가는 요소: 릴레이 * 행동 -> 뷰가 릴레이를 구독, 이벤트가 방출되면 행동을 실행하도록 바인드 map, flatMap, flatMapLatest * map: 이벤트의 타입을 바꾸면서 그대로 다시 구독할 수 있다. * flatMap: 다른 옵저버블을 만들면서 배출할 수 있다. 상위 옵저버블에서
3 min read

Subject

* 차가운 옵저버블을 뜨거운 옵저버블로 변환해주는 클래스이다. * 옵저버블과 옵저버의 역할을 모두 수행할 수 있다. * 같은 동작의 옵저버블을 모아서 관리할 수 있다. * 마음대로 원하는 시점에 값을 발행할 수 있기 때문에 특히 원하는 데이터가 옵저버블이 아닐 때 편하게 사용 가능하다. PublishSubject * 가장 평범한 Subject 클래스이다. * 발생한 값을 그대로 구독자들에게 전달한다. * subscribe() 이후 데이터
4 min read

Observable

사내 스터디로 ReactiveX 반응형 프로그래밍 스터디를 시작하려는데 안드로이드 개발자분과 같이 진행하기 위해 RxJava 책으로 시작했다. Java는 정말 오랜만이었는데 어차피 Reactive 개념이 포인트라 상관은 없었다. RxJava 프로그래밍 - 예스248가지 핵심 개념으로 쉽게 이해하는 리액티브 프로그래밍 입문서버나 애플리케이션은 다양한 데이터를 처리하느라 늘 분주하다. 그런데 데이터양이 기하급수적으로 늘면서 기존의 프로그래밍 방식으로 이를 처리하기가
2 min read

ReactorKit

사내 프로젝트에서 ReactorKit을 메인으로 사용하고 있다. RxSwift 기반의 단방향 프레임워크이다. View * State에 따른 데이터 표현, bind(reactor: )를 가짐 * bind()에서 View→ Reactor 흐름의 Action, Reactor → View 의 State를 모두 바인딩, enum type을 사용하여 동작 정의 * reactor의 프로퍼티가 변경되는 시점(할당, 초기화 등)에 bind가 실행됨 Reactor * Action, Mutation, State를
2 min read