해당 포스팅은 작성자의 학습을 위해 작성된 글 입니다. Opaque Type이란? Opaque Type(불투명한 타입)은 함수로 역제네릭 함수라고 할 수 있습니다. 함수나 메서드의 반환 타입이 특정 프로토콜을 준수하지만, 구체적인 타입은 숨겨짐을 의미합니다. Swift에서는 some 키워드에 Opaque Type을 담아냅니다. 더 쉽게 이해해보겠습니다. SwiftUI의 View 프로토콜은 모든 뷰가 가지고 있어야 할 가장 기본적인 기능을 정의하고 있습니다. View 프로토콜에서 기본 규칙은 var body: some View { get } 프로퍼티를 생성하는 것입니다. 이 body 프로퍼티는 뷰의 내용을 구성하고, 화면에 어떻게 표시될지를 결정하는 역할을 합니다. 예를 들어, ContentView 구조..
* 이 글은 작성자의 학습을 위하여 작성된 글입니다. 2019년, WWDC 2019에서 Apple은 SwiftUI를 소개했습니다. iOS 13과 macOS Catalina 10.15에서 처음으로 지원되기 시작했습니다. SwiftUI의 등장은 Apple 플랫폼에서 UI 개발 방식에 큰 전환점을 가져옵니다. 선언적(Declarative) 프로그래밍 SwiftUI는 선언형 프로그래밍으로, 개발자가 UI의 최종 상태를 선언하면 시스템이 상태변화를 자동으로 처리하여 UI에 대한 코드가 더 간단하고 직관적입니다. 이전의 UIKit은 명령형 프로그래밍으로, UI 요소를 각각 단계별로 관리하고 상태 변화도 수동으로 처리해야했습니다! 명령형 VS 선언형, 무엇이 다를까? 예시로 아보카도 토스트를 만든다고 가정해봅시다. ..
flatMap flatMap 연산자는 들어오는 모든 Observable을 병렬로 구독하고, 이들 각각에서 방출되는 모든 아이템들을 단일 Observable 스트림으로 합칩니다. 만약 여러 Observable들이 동시에 아이템을 방출할 경우, flatMap은 이들 아이템들을 순서와 상관없이 즉시 방출합니다. 이는 동시에 여러 작업을 처리하고 각 작업의 결과를 계속 관찰하고 싶을 때 유용합니다. flatMapLatest flatMapLatest 연산자는 새로운 Observable이 들어올 때마다 이전에 구독한 Observable을 취소하고 새 Observable만을 구독합니다. 항상 최신 결과만을 처리하고 싶을 때 사용됩니다. 즉, 새로운 데이터나 요청이 들어올 때 이전 데이터는 더 이상 중요하지 않고 오직..
나의 첫 출시 앱, 알러지키미 처음으로 기획부터 디자인, 개발까지 전적으로 스스로 해낸, 의미가 깊은 프로젝트입니다. 여러번의 리젝을 받으면서 좌절도 했지만, 앱의 출시 플로우를 제대로 경험해 볼 수 있었습니다. 개발일지로 짬짬히 이슈 등의 과정의 발자취를 남겨두었지만, 출시를 마치고 다시 돌아보기로 했습니다. 기획과 디자인은 어려워 이번 프로젝트는 온전히 나의 것이었기 때문에, 이전까지 배우고 학습했던 것들을 최대한 적용해보고 싶다는 욕심과 경험해보지 못했던 기술들을 적용해보고 싶다는 사심이 많이 들어갔습니다. 네이버 맵 SDK, Mordern Cell을 통한 실시간 검색 시 셀 애니메이션, Tag List 등... 이것저것 넣어보며 기획과 디자인을 마구잡이로 하다보니, 생각보다 이에 시간이 많이 들었..
"무엇"을 사용해서 코딩테스트를 준비해야 하나? macOS > Command Line Tool(명령어 라인 도구)로 새로운 프로젝트를 생성합니다. 🤷♂️: 왜 playground에서 실행 안 하고 Command Line Tool에서 실행하는 걸까요? 🐶: 대부분의 OJ 플랫폼에서는 직접 입출력 부분까지 구현해야 합니다. playground에서는 readLine() 메서드를 사용할 수 없기 때문에 Command Line Tool을 사용해야 합니다. 또한 playground에서는 REPL(Read-Equal-Print Loop) 방식으로 동작하기에 디버깅이 어렵습니다. 이런 이유로 코딩테스트를 준비하기 위해서는 Command Line Tool을 사용합니다. "어디서" 코딩테스트를 연습할 수 있는가? 일반적..
트러블 슈팅🔧 realm fetch에서 시점 문제 충돌 최근 본 상품을 저장하는 과정에서 realm을 사용했다. ProductDetailView에서 pop해서 나올 때, realm에 저장했다. 홈에서 나온 뒤에는 HomeViewController에서는 저장된 realm의 리스트가 보인다. HomeViewController가 매번 나타날 때마다 이 realm을 리스트에 다시 패치해서 보여줘야했다.
트러블 슈팅🔧 시점 문제과 루트뷰 교체. onboarding에서 HomeView로 넘어갈 때, 이전에 보여줬던 뷰를 pop해서 내려야겠다고 생각했었다. 그러나 실행된 뷰를 펼쳐보니 잘 이전 뷰가 내려가지 않고 그냥 쌓여 있었다. 그리고 클로저에 값을 넣어버린 탓에 이번 뷰가 생성된 시점 이후에 UserDefaults에 값을 넣어줘서 바로 반영이 안되는 문제가 있었다. 루트뷰 자체를 바꿀 수 있었다! sceneDelegate를 불러와서 루트뷰를 교체해주면 된다! 그리고 클로저에 값을 넣지 않고 HomeViewController 인스턴스 생성시점 전에 UserDefaults에 값을 저장했다. 느낀점 이전에는 구현에만 급급해서 자잘한 오류 발생요인들을 놓치고 갔다..
트러블 슈팅🔧 내가 잡은 레이아웃을 무조건 신뢰하지 말자. 이렇게 레이아웃을 짜놓고 왜 태그리스트를 담은 collectionView가 뜨지 않는지 한참을 고민하고 헤맸다. 처음에는 데이터가 잘 안 들어오는 줄 알고 UICollectionViewDelegate 프로토콜 numberOfItemsInSection과 cellForItemAt에서 올바르게 출력이 되고 있는지 확인해 보았다. numberOfItemsInSection 함수는 출력이 되나 cellForItemAt은 출력되지 않았다. 더미 데이터를 넣어보면서 테스트해도 에러도 발생하지 않았다. 무엇이 문제인 걸까? 고민하면서 돌고 돌아 레이아웃으로 돌아왔다. 설마설마하면서 collectoinView의 공간이 모자라서 셀들이 출력되지 않은 것일까! 하며 ..