일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 운영체제
- Swift
- composable architecture
- 네트워크
- 1일1알골
- 위젯킷
- swift concurrency
- 스유
- spritekit
- 후기
- c++
- 문법
- 웹
- Protocol
- widget
- cs
- 컴퓨터그래픽스
- uikit
- 멋사
- SwiftUI
- 멋쟁이사자처럼
- 영남대
- 대외활동
- 스위프트
- TCA
- dispatchqueue
- 알고리즘
- 백준
- 리액트
- widgetkit
- Today
- Total
목록앱 (114)
맛동산이
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/5eERO/btsMdmiBZQc/sP5Mc9hXX1Ro3NEhx8lWkK/img.png)
swiftUI를 통해서 Watch앱을 구성해야하는데, 이때 TCA를 도입하였습니다.하지만, watch는 watchConnectivity를 사용해야하는데, 이때 watchConnectivity는 Delegate로 다 구현되어있습니다.하지만 TCA에서는 이러한 외부 의존성에 대해서는 Dependency를 사용하고 있기 때문에 기존의 delegate를 래핑할 필요가 있었습니다.따라서 해당 코드를 짜기 이전에 swift concurrency를 간단하게 이해하고, 래핑하는 코드까지 살펴보도록 하였습니다.Swift concurrency내부적으로 어떻게 많이 돌아가고 하는 내용은 조금 제외하고, 간략하게 설명하면서 swift concurrency와 asnycStream과 같은 내용을 정리해봅시다.async funcf..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bkzIQ7/btsL1kssTat/PFIILRAobIp9w72kkuWvKk/img.png)
회사 작업을 하다보면 api의 목데이터나, 혹은 배포가 되기 이전에 목api를 사용하고 싶을때가 존재한다.이때 moya를 이용하고 있다면 목데이터를 직접 설정하여 사용할수 있다. Moya 기초moya는 alamofire를 래핑하고 있는 라이브러리로, TargetType이라는 프로토콜을 사용해서 상당히 간단하게 api를 작성하고 사용할수 있다.moya에서 사용하는 중요한 개념들Provider: Moya의 MoyaProvider는 모든 네트워크 서비스와 상호작용할때 사용할 객체Target: Moya target은 일반적으로 전체 API 서비스를 설명합니다. 타겟은 서비스, 그 자체의 가능한 끝점, 요청을 이행하는 각 끝점에 요구되는 정보를 설명합니다. TargetType 프로토콜을 체택하는 것으로 tar..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ckSdrh/btsL1z3VOFH/jaSnKKyKaXqXaIPrQkNXFK/img.png)
먼저 테스트 코드의 장점과 단점 이런글보다는이번글은 좀더 리액터킷의 테스트 코드를 짜기 위한 방법론에 가까운 글이다.무작정 한번 알아보자~ 테스트 코드 작성하는 방법테스트 케이스 이름 작성법test_유닛이름(구조체, 클래스 등)_유닛내부(프로퍼티, 메서드 등)_예상동작맨 앞에 test는 꼭 붙여줘야 테스트를 실행할 수 있다. 테스트 케이스 구조는 다음과 같다. 1. Given(주어진 상황)테스트 케이스에서 테스트할 상황을 설정하는 부분테스트에 필요한 초기 조건을 설정하고 입력값을 준비테스트 환경 설정 or 객체를 생성하는 등의 작업을 수행함 2. When(동작)테스트할 동작이나 메서드를 호출하는 부분테스트 대상이 되는 메서드나 특정 동작을 수행하고 그 결과를 확인 3. Then(결과 확인)테스트의 예상..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/eDXUTZ/btsKaQE0lJw/lsWZgfnwoorIYRgLVGoP11/img.gif)
Two button slider를 구한현 예제가 많지 않고, 거기에 이번에 회사 스팩중에 하나가 슬라이더 안에 밑에 격자가 들어가거나, 위에 점이 들어가거나 하는 커스텀이 많이 들어갔다.그래서 나처럼 구현할 사람이 있을것 같아서 블로그에 남겨본다.먼저 편의성을 위해서 snapkit과 then을 사용한 코드 임을 감안! 해주세요!슬라이더 예시 //// SliderView.swift// twoHandledSlider//// Created by 최진용 on 10/12/24.//import UIKitimport Thenimport SnapKitprotocol SliderViewDelegate: AnyObject { func sliderView(_ sender: SliderView, changedV..
두개의 reducer와 state그리고 화면을 이동하는 방법을 사용할때는@PresentsPresentationActionifLet을 사용하게 된다.1. 먼저 가고자 하는 뷰의 State를 @Presents로 감싼다.또한 네이게이션 stack이 될 array을 생성한다. (보편적으로 스택의 경우에는 최상단의 뷰가 가지면 된다.)밑의 코드에서는 concats가 stack이 될 array @ObservableState struct State: Equatable { @Presents var addContact: AddContactFeature.State? var contacts: IdentifiedArrayOf = [] }해당 뷰로 이동할지 안할지 모르니까 옵셔널 값.2. 해당 뷰로 이동하는 액..
Effect는 Action을 통해서 동작할 동작들을 의미한다.Effect에는 다음과 같은 동작들이 존재한다 .none: 즉시 완료run: 비동기 작업send: 전달된 Action을 즉시 내보냄cancel: 진행중인 Effect를 취소merge: 동시에 실행되는 단일 Effect로 병합concatenate: 차례로 실행되는 단일 Effect로 연결animation: SwiftUI의 .withAnimationtranscation: SwiftUI의 .withTransactiondebounce: debounce Effect로 변경throttle: trottle Effect로 변경Effect는 기본적으로 단일의 행동을 하도록 하고, 여러 동작을 묶을수도 있으며, 연쇄적으로 동작할수도 있다.예시 )Reduce { ..
TCA의 큰 흐름은, 뷰가 존재하고, 뷰에서의 이벤트를 감지해서 Action으로 그리고 해당 Action을 Effect로, Effect를 통해서 State를 변경해주는 방법이다.즉View→Action→Effect→State→View의 큰 흐름이 된다.이때 Action이 방대해지면, Action을 명확하게 어떠한 액션인지 구분하기 어렵게 된다.이를 해결하기 위해서 NestedAction을 통해서 액션의 타입을 명확하게 구분해주는 것으로코드의 명확성과 가독성을 올리는 방법을 소개하려고 한다.enum Action { case onAppear case task case tapOpenButton //현재는 taskResult는 duplicated될 예정이기 때문에 Result를 사용하는게 좋다. case upLo..
예를 들어서, 로그인 상태를 바라본다고 했을때로그인 상태는 앱이 시작됨과 동시에 계속해서 해당 값을 바라보고 있다가.로그아웃이 될때 앱의 화면을 변경해줘야하는 상황이 발생한다.이처럼 앱 전반적으로 해당 상태를 옵저빙 해야하는 경우가 발생하고 이를 해결할수 있는 방법이 크게shared stateasyncStream가 있다.AsyncStream을 통한 공유 상태 처리하는 법Shared data in a TCA app1. Dependency 정의해주기struct AuthenticationClient: Sendable { var currentUser: @Sendable () -> AppUser? var listenAuthState: @Sendable () async throws -> AsyncThro..
TCA에서는 State와 Reducer가 서로 얽히고 설켜있는 상태를 보기가 쉽다.특히나 화면전환에서는 SwiftUI에서는 상태값에 따른 화면 변화가 많은데, 이러한 경우 초기 값을 nil로 설정해주기 때문에 이러한 화면에 대한 언래핑이 필요하다.SwiftUI 에서의 기본적인 화면 전환은 다음과 같다.struct MainView { @State var isUserLogged: Bool = false var body: some View { if isUserLogged { MainTabView() } else { LoginView() } }}이러한 경우 TCA에서는 해당 값을 State로 받아야하고 해당 State는 옵셔널 값이 되는데이러한 옵셔널 State를 안전하게 언래핑 하는 방법..