728x90

SwiftUI 53

@ViewBuilder는 언제 사용할까?

안녕하세요. ViewBuilder는 언제 사용할까요? # 예시 # some View를 반환하는 함수에서 에러 나요ㅠㅠ 간단한 예시로 Text 뷰를 반환하는 함수가 있다고 해볼게요. 여기까진 문제없어요ㅎㅎ 살짝 복잡하게 가볼게요. Toggle 버튼 on/off로 Text 뷰와 Button 뷰가 번갈아 보이도록 만들어볼게요. 문제없어 보였지만 view 함수에서 이런 에러가 발생합니다. error: Function declares an opaque return type 'some View', but the return statements in its body do not have matching underlying types some View는 opaque type이고 underlying type이 1가지만..

SwiftUI 2023.12.19

TCA(10) : Custom Dependency

안녕하세요. 이번엔 TCA의 Custom Dependency에 대해 알아볼게요. (TCA 1.2.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) 저번 TCA(9) : Dependency 글에서 알아본 TCA 자체가 제공하는 Dependency 모듈 외에도 TCA는 서버 API 호출과 같은 사용자가 직접 정의한 모듈들에 대한 의존성 주입도 간편하게 수행할 수 있습니다. (저는 그냥 편하게 custom dependency라고 부르려구요..ㅎ) TCA에서 사용자 정의 모듈을 의존성 주입하려면 크게 3가지 단계를 거쳐야 합니다. 1) DependencyKey를 준수하는 Key 타입 추가 2) DependencyValues를 확장한 변수 정의 3) Reducer에 @Dependency 변수 추가 위 방법..

SwiftUI 2023.10.10

TCA(9) : Dependency

안녕하세요. 이번엔 TCA의 Dependency에 대해 알아볼게요. (TCA 1.2.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) # 개요 TCA에서는 기능(Reducer)에서 필요한 의존성(Dependency) 주입을 쉽게 처리할 수 있습니다. [참고] TCA의 의존성 관리 시스템 TCA는 pointfreeco에서 만든 swift-dependencies 라이브러리를 사용하고 있습니다. 실제로 TCA가 제공하는 의존성 모듈들은 swift-depdendencies 라이브러리에서 나온 것입니다. Document가 잘 되어 있으니 한번 읽어보시는 것을 추천해요. 이번 글에선 TCA가 제공하는 Dependency 모듈을 Reducer에 어떻게 주입하는지에 대해 알아볼게요. (커스텀 모듈을 주입하는 방..

SwiftUI 2023.10.01

TCA(8) : Binding

안녕하세요. 이번에는 TCA의 Binding에 대해 알아볼게요. (TCA 1.0.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) TCA의 Binding 기능을 사용할 땐 크게 3단계로 진행됩니다. 1) State에 Binding이 필요한 값을 BindingState property wrapper로 선언 2) Action에 BindableAction 프로토콜을 채택시키고, binding case 추가 3) Reducer의 body에 BindingReducer 추가 쉽게 설명하기 위해 TCA Binding을 활용해서 아래와 같은 URL 인코딩을 해주는 예제를 만들어볼게요. 먼저, State에 Binding이 필요한 값(변수)을 BindingState property wrapper로 선언해 줍니다. ..

SwiftUI 2023.08.09

TCA(7) : 0.54.0 -> 1.0.0 업데이트

안녕하세요. TCA 1.0.0이 배포된 것을 기념(?)하여, 제가 만든 TCA 샘플 프로젝트의 TCA 버전을 0.54.0 -> 1.0.0으로 업데이트해 보는 시간을 가져볼게요. (전체 코드는 여기를 참고해 주세요!) 아마 저처럼 TCA 0.x.x. 버전을 쓰시다가 1.0.0 버전으로 업데이트한 경우라면, 빌드 에러가 발생할 확률이 매우 큽니다.. 하나씩 고쳐볼게요ㅠㅠ ## (변경사항 0) deprecated API 제거 가장 큰 이유는 TCA 1.0.0으로 오면서 이전 deprecated 된 API들이 모두 제거되었어요. 만약, deprecated 된 API를 사용 중이시라면 모두 수정해야 합니다. ## (변경사항 1) ReducerProtocol -> Reducer ReducerProtocol이 Red..

SwiftUI 2023.08.07

TCA(6) : WebView

안녕하세요. 이번에는 TCA를 활용하여 WebView를 만들어볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) Reducer, Scope, TaskResult 등 지금까지 TCA에 대해서 간단하게 알아봤는데요. 지금까지 공부한 것을 활용하면 자식 WebView를 만들 수 있습니다!!ㅎㅎ [참고] TCA로 WebView 만들면 뭐가 좋아? UIKit 기반의 WebKit의 이벤트를 SwiftUI로 던져주거나, 반대로 SwiftUI 이벤트를 WebKit으로 던져주기 쉽습니다. 이전 글에서 다 다뤄봤던 내용이기 때문에 자세하게 설명은 생략하고 WebView, WebViewReducer 코드 먼저 보여드릴게요. (좀 길어요..;;) 아직까진 SwiftUI 용 WebView가 따로..

SwiftUI 2023.07.28

TCA(5) : 부모-자식 간 이벤트 전달

안녕하세요. 이번에는 TCA를 활용하여 부모 Reducer와 자식 Reducer 간에 이벤트 전달하는 방법에 대해서 알아볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) # 부모-자식 간 이벤트 전달하는 방법 부모 Reducer가 자식 Reducer에게 또는 자식 Reducer가 부모 Reducer에게 이벤트를 전달하는 방법은 개념만 알고 있으면 크게 어렵지 않습니다. (물론 Notification을 쓰지 않구요!) 부모 Reducer에서 Scope를 사용해서 자식 Reducer를 정의한 것 기억하시나요?? [참고] Scope란? Scope에 대해 정리한 글이 있으니 먼저 보고 오시면 쉽게 이해가 되실 거예요. 부모 Action 안에는 자식 Action도 포함되어 있어요..

SwiftUI 2023.07.20

TCA(4) : Scope

안녕하세요. 이번에는 TCA의 Scope에 대해서 알아볼게요. (TCA 0.54.0 기준으로 작성했으며, 전체 코드는 여기를 봐주세요!) # Scope? Scope를 사용해서 부모 Reducer에 자식 Reducer를 포함(선언? 정의?)시킬 수 있습니다. (Scope로 A(부모) Reducer와 B(자식) Reducer를 연결해 준다고 이해하면 될 것 같아요.) Reducer에서의 부모-자식 관계는 여러 가지가 될 수 있는데요. 큰 Reducer를 작은 Reducer로 쪼개는 것도 부모-자식 관계가 될 수 있고, 뷰 계층에서 부모 뷰의 Reducer와 자식 뷰의 Reducer도 부모-자식 관계가 될 수 있어요. # TCA에서의 부모-자식 관계 특징 부모-자식 관계를 설정했을 때의 가장 큰 특징은 2가..

SwiftUI 2023.07.12

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

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

SwiftUI 2023.06.28