728x90

분류 전체보기 298

[WWDC22] Embrace Swift generics

안녕하세요. 이번에는 WWDC22에서 소개된 'Embrace Swift generics' 란 세션으로 Swift의 추상화 방법에 대해 자세하게 알아보는 시간을 가져볼게요. Cow(🐮)라는 구조체가 있다고 해볼게요. Cow는 Hay(건초)를 매개변수로 가진 eat(먹기) 함수를 가지고 있습니다. Hay(건초) 구조체는 건초를 생산하는 작물인 알팔파를 재배하기 위한 grow(키우기) 함수를 가지고 있습니다. Alfalfa(알팔파) 구조체는 알팔파로부터 건초를 harvest(수확)하는 함수를 가지고 있습니다. 마지막으로 Farm(농장) 구조체는 Cow에게 먹이를 주는 feed(먹이기)라는 함수를 가지고 있습니다. 그런데 농장에서 키울 수 있는 동물이 Cow(🐮) 밖에 없는건 아니잖아요?? 우린 확장성을 ..

WWDC 2023.07.03

Opaque and Boxed Types

안녕하세요. 이번엔 Swift의 opaque types와 boxed protocol types 관련 Document를 읽고 정리해 보는 시간을 가져볼게요. (Document에 있는 예제를 활용해서 정리해 볼게요.) Shape이란 protocol을 정의하고, Shape protocol을 준수하는 Triangle이란 구조체가 있다고 해볼게요. 여기까진 ㅇㅋ. 제네릭을 사용해서 FlippedShape란 구조체도 만들어봤어요. 이것도 ㅇㅋ... 라고 넘길 수도 있지만! flippedTriangle 상수를 잘 살펴보면 제네릭의 구체적인 타입까지 같이 노출되고 있죠? 만약 제네릭 타입을 2개 받는 구조라면, 2개의 구체적인 타입까지 같이 노출되게 됩니다. 사실 사용자 입장에선 제네릭 타입이 어떤 타입인지 알 필요..

Swift 2023.07.01

navigationBar가 숨김 처리된 상태에서 제스처로 화면 뒤로가기

안녕하세요. 개발하면서 새롭게 알게 된 사실 하나 공유할게요. (UIKit이든 SwiftUI든) NavigationView를 사용하면, 이렇게 swipe 동작으로 손쉽게 이전 화면으로 돌아갈 수 있습니다. 이때 커스텀 navigationBar를 사용하고 싶으면 기본 navigationBar를 숨겨야겠죠? 그런데 (iOS 16 이하에서) navigationBar를 숨기면 push와 dismiss 동작은 잘 동작하지만, swipe로 뒤로 가기 동작은 쓸 수 없더라구요.. 만약, navigationBar를 숨기고 동시에 swipe 동작을 사용하고 싶다면, 아래 코드를 추가해 주면 됩니다. (다만, 이 방법은 앱 전체에 영향을 미치는 코드이기 때문에 사용할 때 신경 써야 할 것 같아요. 개인적으로 앱 전체에 영..

SwiftUI 2023.06.28

TCA(3) : _printChanges

안녕하세요. 이번에는 TCA로 디버깅하는 방법에 대해 알아볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) __printChanges() 함수를 사용하면 콘솔 로그에서 State 값이 어떻게 바뀌고 있는지 한눈에 볼 수 있으며, 어떤 Action이 발생했는지와 내부에서 어떤 Action이 전달되고 있는지를 확인할 수 있습니다. 참고로 __printChanges는 Debug Configuration 일 때만 로그를 남기므로, #if DEBUG로 분기처리를 할 필요가 없습니다 :) __printChanges는 크게 2군데에서 사용할 수 있으며, 기능에 약간의 차이점이 있습니다. Reducer WithViewStore Reducer에서 __printChanges 함수를 사용할..

SwiftUI 2023.06.24

TCA(2) : TaskResult, run

안녕하세요. 저번엔 TCA를 활용하여 아주 간단한 예시를 만들어봤습니다. 정확하게는 TCA를 사용해서 사용자 Action 이벤트를 통해 State 값을 동기적으로 바꾸고 바뀐 값이 UI에 반영시키는 것을 경험해 봤어요. 제가 '동기적'이란 말에 강조를 했죠?? '동기'하면 동시에 '비동기'가 떠오르지 않나요??ㅎㅎ.. 맞습니다. 이번에는 TCA를 사용해서 비동기 API를 호출하는 방법에 대해서 알아보고 간단한 예시를 만들어볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) TCA로 비동기 동작을 하고 싶을 때는 run과 TaskResult를 기억해야 합니다. 저번 TCA 예제를 다시 돌이켜보면, State 값을 (동기적으로) 변경하고 다른 추가 동작이 필요 없을 때 뭘 했..

SwiftUI 2023.06.20

[SDK] SwiftEmitModule normal arm64 Emitting module for xxx (in target 'xxx' from project 'xxx') 에러 해결방법

안녕하세요. 오늘도 삽질을 거하게 했습니다..;; # 이슈 TestProject.xcworkspace 안에 CoreFramework와 TestFramework라는 프로젝트가 있다고 가정해 볼게요. (TestFramework 내부적으로 CoreFramework를 사용하는 구조라고 할게요.) 저는 TestFramework.xcframework라는 SDK를 만들고자 아래 명령어를 호출했는데요. 바로 에러가 발생해 버리더라구요. # 해결 방법 아래처럼 명령어에 workspace 옵션도 같이 명시해 주세요. # 참고 - https://stackoverflow.com/questions/66470694/got-an-archive-failed-when-trying-xcodebuild-archive-in-terminal..

TroubleShooting 2023.06.15

TCA(1) : ReducerProtocol, StoreOf, WithViewStore

안녕하세요. 이번에는 대표적인 튜토리얼로 많이 사용되는 카운터를 TCA로 만들어볼게요. TCA 0.54.0 기준으로 작성했습니다. 전체 코드는 여기를 봐주세요! 초기값 0부터 시작해서 간단하게 +/- 버튼이 있고 버튼을 누를 때마다 값이 증가하고 감소하는 앱을 만들어볼게요. 일반적으로 TCA의 State, Action, Reducer는 ReducerProtocol을 준수하는 구조체 안에 정의를 합니다. ReducerProtocol을 채택한 Counter 구조체를 만들어줄게요. 그다음은 ReducerProtocol을 채택한 구조체(=Counter) 안에 State, Action, Reducer를 정의할 차례입니다. 일단 State 먼저!! State는 UI를 그리거나 내부 비즈니스 로직을 수행할 때 필요한..

SwiftUI 2023.06.13

TCA(0) : The Composable Architecture 개요

안녕하세요. 올해 3월쯤, iOS 앱 개발 미션이 들어왔어요. SwiftUI로 개발하기로 결정했고, 어떤 모듈을 사용할까 고민하던 중 The Composable Architecture (일명 TCA) 라는 것을 알게 되었습니다. 짧은 고민 끝에, TCA를 채용하기로 결정했고 현재 앱 개발이 완료된 상태입니다. 그래서 한동안은 실제 앱 개발을 통해 얻은 TCA 관련 지식과 활용 방법에 대해서 시리즈로 정리해 볼까 해요. 이번 글은 TCA 개요 정도에서 글을 마무리하고, 다음 TCA 시리즈부턴 실제 코드를 보면서 글을 써보겠습니다. ## Overview 공식 명칭은 The Composable Architecture 이고, 줄여서 TCA라고 말합니다. TCA는 SwiftUI 뿐만 아니라 UIKit에서도 사용..

SwiftUI 2023.06.07

[심사] Guideline 2.3.3 - Performance - Accurate Metadata

# 리젝 이유 Specifically, your iPad Pro (2nd Gen) and iPad Pro (6th Gen) screenshots show an iPhone device frame. # 분석 iPhone만 지원할 것이기 때문에 Xcode > Target > General > Supported Destinations에서 iPhone만 선택해서 빌드 및 업로드를 했습니다. 그래서 App Store Connect에 iPad 스크린샷을 업로드하지 않고 심사 요청했는데... 심사 반려를 당했네요..;; # 해결방법 AppStore 콘솔에 iPad 스크린샷이 잘못 들어갔네요...;;; 스크린샷 제거 후 다시 심사 요청했더니 통과했습니다...ㅎ..;;; Info.plist를 보면 기본으로 Support..

TroubleShooting 2023.06.04

Thread.sleep vs Task.sleep

안녕하세요. 이번엔 Thread.sleep과 Task.sleep의 차이점에 대해 알아보려고 합니다. # 주요 차이점 Thread.sleep Task.sleep iOS 2.0 이상 iOS 13.0 이상 구 API 신 API cancel 불가능 Task cancel 가능 주어진 시간 만큼 Thread 멈춤 현재 Task를 중지하고, 주어진 시간 동안 다른 Task 수행 (Thread를 멈추는 것이 아님) # 예시 1초 sleep을 100번 수행했을 때 Thread.sleep과 Task.sleep이 어떻게 다르게 동작하는지 살펴볼게요. 가장 이상적인 동작은 1초만 sleep 하는 것이겠죠? (100개의 Task(or Thread)에서 동시에 1초를 sleep 하면, 실제 시간으로 1초만 sleep 한 거랑 동..

Swift 2023.06.01