일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹
- TCA
- swift concurrency
- 멋사
- 문법
- 후기
- Swift
- 컴퓨터그래픽스
- 네트워크
- 위젯킷
- spritekit
- 리액트
- 스유
- c++
- dispatchqueue
- 영남대
- 스위프트
- composable architecture
- uikit
- 대외활동
- 알고리즘
- 백준
- ReactorKit
- Protocol
- cs
- widgetkit
- 멋쟁이사자처럼
- SwiftUI
- widget
- 운영체제
- Today
- Total
목록앱 (115)
맛동산이
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를 안전하게 언래핑 하는 방법..

딥링크란, iOS에서 url을 통해서 웹에서 앱을 호출하는 기능을 의미한다.딥링크의 방법은 크게, 3개정도로 나눌 수 있다.URL 스킴 : 앱내 URL 스킴을 저장하여 딥링크 사용유니버셜 링크 : 도메인 주소를 이용하여, 앱이 설치되어있는지 아닌지에 따라 앱내부 또는 앱스토어로 이동하게 하는 링크다이나믹 링크 : 파이어베이스에서 제공하는 딥링크의 일종iOS에서 유니버셜 링크와 딥링크의 차이점은사용 자체는, 사용자로 하여금 웹 페이지에서 앱으로 끌고 올 수 있다는 점에서 동일하다.하지만 Web fallback이 지원된다는 것 (앱이 없으면 웹으로 간다)이 가장 큰 차이.Deep link 주소로는 앱이 없다면 아무것도 할수 없지만, 유니버셜 링크에서는 앱이없다면 웹으로 호출하게 된다.결과적으로 같은 주소로 ..
swift concurrency와 result에 대해서 사용을 하려고 하다보니 Error타입에 대해서 계속해서 등장을하는데 한번도 제대로 공부해본적이 없는것 같아서 정리해보려고 한다.Error스위프트에서 Error는 Error라는 프로토콜을 준수하는 값 타입으로 표현된다.Error는 빈 프로토콜이라서 Error를 던져주기 위해서는 Error를 그냥 쓰면 안되고 enum으로 Error를 정의해서 던져줘야 제대로된 Error를 채택하는 에러를 ㅋㅋ( 말이 웃기네 ㅋㅋㄹㅋㅋ) 던져준다.그냥 간단하게 Error자체로는 못씀.enum으로 Error를 정의해줘야 사용가능Error 타입 정의enum NetworkError: Error { case 종류1 case 종류2 case 종류3 //.....

OptionSet은 Swift에서 바이너리 플래그값을 관리하거나 한개의 플래그 값을 조절할때 사용한다.즉 OptionSet은 어떠한 플래그값을 여러개로 나누어서 관리할때 사용한다는것이다.What is OptionSet? 옵션셋은 비트마스크를 이용해 여러가지 옵션을 다룰때 채택하는 프로토콜이다.옵션셋을 사용하여 다양한 옵션을 구현하려면 다음과 같이 사용하면 된다. struct ActionSheetOptions : OptionSet { let rawValue: Int static let report = ActionSheetOptions([]) static let edit = ActionSheetOptions(rawValue: 1 각 옵션은 shift 연산으로 구분된다.Why Optio..

기본적인 비동기var body: some ReducerOf { Scope(state: \\.login, action: \\.login) { Login() } Reduce { state, action in switch action { case .test1: return .run { 여기 안에서 비동기를 처리 해준다. } case .fetch(.success): return .none case .fetch(.failure): return .noneTCA에서는 비동기 처리를 해줄..
💡 TCA는 단방향 아키텍쳐로, 상태관리가 용이하고, 데이터 흐름이 명확하게 정의되어 있기 때문에 단방향으로 이해하기 쉽습니다.TCA 의 장점모듈화: TCA는 애플리케이션을 작은 모듈로 나누어 관리할 수 있도록 도와줍니다. 각 모듈은 독립적으로 테스트하고, 유지보수할 수 있어 코드의 가독성과 재사용성이 향상됩니다.예측 가능성: 상태의 변화가 명확하게 정의되어 있어, 애플리케이션의 동작을 예측하기 쉽습니다. 모든 상태 변화는 액션을 통해 이루어지며, 이는 디버깅과 유지보수를 용이하게 만듭니다.테스트 용이성: TCA는 테스트를 쉽게 할 수 있도록 설계되었습니다. 상태, 액션, 리듀서를 독립적으로 테스트할 수 있어, 각 모듈의 동작을 검증하는 데 유리합니다.상태 관리: TCA는 중앙 집중식 상태 관리를 제공..

[Swift] async / await & concurrency기본적으로 이전에는 async await을 api 통신에서만 사용한다고 생각을 했지만, 최근에 asnyc await을 알게되면서, 해당 코드를 통해서 delegate나, completionHandler방식으로 처리되고 있던것 또한 i/o 입력에 의한 비동기 처리기 때문에 이를 async 스타일로 리팩토링이 가능하다는것을 알게되어 정리해보려고 한다.먼저 async awai는 예전에 정리한적이 있기 때문에 넘어가도록 하고async 와 await을 연결해주는 continuation 이라는 개념을 최근에 알게되었기 때문에 정리해보자!What’s continuation?동기 코드와 비동기 코드를 이어주는 인터페이스이다.기존에는 delegate와 com..

DecodableDecoder는 JSON type으로 오는 데이터를 네이티브한 포멧과 매핑이 가능하도록 하는 프로토콜이다.보통 Codable이 Encodable, Decodable 두개를 타입엘리어싱 하기 때문에 Codable만 채택해도 큰 문제는 없다.CodingKey실제로 RESTFUL API와 실제로 내부에서 사용하는 데이터의 네이밍이 다른경우가 많은데 이를 코딩키를 통해서 매핑해줄수 있다.struct DecodingModel: Decoding { let userName: String let userAge: Int enum CodingKeys: String, CodingKey { case userName = "user_name" case userAge = "user_age" ..
transform()transform() transforms each stream. There are three transform() functions:func transform(action: Observable) -> Observablefunc transform(mutation: Observable) -> Observablefunc transform(state: Observable) -> ObservableImplement these methods to transform and combine with other observable streams. For example, transform(mutation:) is the best place for combining a global event stream ..