SwiftUI에서 View Refresh없이 값 수정하기

SwiftUI View와 값 타입 값 타입은 속도가 빠르고 기본적으로 불변성이 있어 예측이 쉽다는 장점이 있다. SwiftUI의 View는 값 타입으로만 구현할 수 있고, Equatable(==) 연산을 통해 뷰의 변경사항을 추적하여 변경된 부분에서만 효율적으로 뷰를 그린다. 이 때 변경사항을 추적해 뷰를 다시 그리기 위한 플래그로 뷰 하위 프로퍼티에 @State나 @StateObject와 같은 어노테이션을 사용해

2 min read

More issues

SwiftUI+DI

SwiftUI에서의 추상화 SwiftUI로 뷰를 구현하면서 추상화된 객체가 필요한 시점이 있다. UIKit과 같이 MVVM을 구현한다면 사실 ViewModel까지는 구체타입으로 두고(예전에는 이 부분이 안티패턴이라고 생각했는데, 경험상 1:1을 벗어난 적이 거의 없어서 고민하던 참이다.) ViewModel을 다른 추상타입에 의존시키는 방법을 사용할 수 있겠지만, ViewModel을 걷어내는 시점에서 결국 View에서 추상 타입을 바라봐야 하는 시점이
3 min read

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

사내 프로젝트에서 사용자 이벤트 추적을 위해 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

Scheduler

스케줄러 개념 * 작업을 어느 문맥(컨텍스트)에서 실행할지 결정한다. * 다루기 어려운 스레드 개념을 스케줄러를 통해 구현 가능하게 해준다. * 필요한 작업을 다른 스케줄러에서 실행하여 비동기로 동작할 수 있도록 한다. * 별도로 스케줄러를 지정하지 않으면 현재 스레드에서 동작을 실행한다. RxSwift 스케줄러 종류 MainScheduler * UI를 변경하거나 높은 수준의 작업을 위한 스케줄러이다. * 시간이 오래 걸리는
4 min read