썸네일 [iOS] 기존 프로젝트에 Tuist v4 적용하기(2/2) 1. 모듈화 계획이전 포스팅에서 기존 프로젝트에 Tuist를 적용하기 위해 기본 세팅까지 마무리를 했고,이번에는 레이어 별로 모듈화를 진행하려고 한다. [iOS] 기존 프로젝트에 Tuist v4 적용하기(1/2)1. Tuist 설치Tuist는 이제 brew말고 mise로 설치하기를 권장한다.brew로 mise를 설치하고 mise로 Tuist를 설치해주었더니 @4.55.6 이 설치되었다.// brew: 다양한 개발 툴과 소프트웨어를 쉽게 설치/관리하는slaveshin.tistory.com 일단, 우리 프로젝트는 클린 아키텍쳐 기반으로 구조를 설계했고 레이어별로 디렉터리를 나눠놓았다.나는 레이어 별로 모듈화를 하고 참조가 필요한 레이어에서 import 하여 명확하게 관심사 분리를 하고 싶었기 때문에위 나뉘..
썸네일 [Swift] 접근 제어(Access Control) 0. 서론최근에,, 기존 프로젝트에 Tuist 모듈화를 적용하게 되어서 공부해본다..!!1. 접근 제어란?다른 소스파일 및 모듈의 코드에서, 코드의 일부에 대한 접근을 제한한다.Swift에서는 open, public, internal, fileprivate, private 총 다섯가지의 접근 제어자를 사용해서 접근을 제한 할 수 있다. 접근 제어의 기준이 되는 것은 모듈, 소스 파일 그리고 패키지 이다.모듈(Module)은 코드를 배포할 수 있는 단위 이고(우리가 흔히 import해서 사용하는 framework들),소스 파일은 모듈 내의 단일 파일을 말한다.(~.swift로 된 것들) 또한 패키지는 모듈의 그룹이라고 생각하면된다. 2. Access Levels접근 제어의 수준은 open(가장 개방) → ..
썸네일 [iOS] 기존 프로젝트에 Tuist v4 적용하기(1/2) 1. Tuist 설치Tuist는 이제 brew말고 mise로 설치하기를 권장한다.brew로 mise를 설치하고 mise로 Tuist를 설치해주었더니 @4.55.6 이 설치되었다.// brew: 다양한 개발 툴과 소프트웨어를 쉽게 설치/관리하는 패키지 매니저brew install mise// mise: 여러 프로그래밍 언어와 런타임의 버전을 프로젝트별로 관리하는 버전 매니저mise install tuist 2. 기존 프로젝트에 Tuist 초기화프로젝트의 루트 폴더에서 tuist init을 입력하면, 기존 프로젝트에 통합 할 것인지 새로 프로젝트를 만들 것 인지 묻는다.// tuist로 초기화tuist init 나는 기존 프로젝트에 적용할 것 이므로 Integrate with [프로젝트명]을 선택해주었다...
썸네일 [Swift] 제네릭(Generic) 1. 제네릭이란?제네릭은 타입에 의존하지 않는 범용 코드를 작성할 때 사용한다. 제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다.예를 들어, Stack 자료구조를 직접 만든다고 생각해보자. Character를 담을 수 있는 Stack은 이렇게 짤 수 있을 것이다.class CharStack { private var elements: [Character] = [] func push(_ value: Character) { elements.append(value) } func pop() -> Character? { return elements.popLast() } func peek() -> Character? { ..
썸네일 [Swift] 클로저, 클로저 캡쳐 이전 포스팅에서는 ARC, 순환 참조, 약한 참조에 대해 포스팅 해보았기 때문에이번에는 이어지는 내용인 클로저에 대해서 공부해보았다. 1. 클로저(Closure)란?보통 이름이 없는 1급 객체(변수처럼 사용하거나, 함수의 인자, 반환값으로 쓸 수 있는) 함수를 우리는 클로저라고 부른다.이해를 돕기 위해 원래 우리가 쓰는 형태의 함수를 클로저로 만들어보자.기본다음과 같은 형태의 함수를 클로저 가장 기본 형태로 만들면func add(_ a: Int, _ b: Int) -> Int { return a + b} 아래처럼 표현할 수 있다.let add = {(a: Int, b: Int) -> Int in return a + b} 축약까지 쭉쭉 가보자// 1. Swift에서는 타입추론이 가능하므로 타입을 생략..
썸네일 [Swift] ARC, weak, unowned 1. ARC(Automatic Reference Counting)Swift에서 메모리 관리는 ARC을 통해 이루어진다.객체가 생성될 때마다 강한 참조 카운터가 1씩 증가하고, 해당 객체를 참조하는 다른 객체가 생기면 카운트가 1씩 증가한다.마찬가지로, 객체를 더 이상 참조하지 않으면 해당 객체에 대한 강한 참조 카운터는 1씩 감소하고 0이 되면 메모리에서 해제한다. 실제로 순환 참조가 생기는 상황을 만들어보자.아래 코드 처럼 두 개 이상의 객체가 서로를 강하게 참조하면 순환 참조가 생기고 메모리 누수로 이어진다. A Class에 B Class를 참조할때 weak 키워드를 붙여본다면, 순환 참조가 생기지 않고 메모리에서 해제되는 것을 볼 수 있다. 이처럼 weak 키워드를 붙여서 약한 참조를 하게 되면,..
썸네일 [SwiftUI] 렌더링 실험 0. 서론렛어스 고에서 숲의 스마일님이 연사한 SwiftUI 렌더링 성능 개선 컨퍼런스 영상을 보고 너무 재밌어서 여기에 했던 실험 + 내가 그동안 궁금했던 것들까지 실험해 보았다.https://www.youtube.com/watch?v=N2Wq-MMx81c&list=PLfx4MMAj7YbHmfbcHSGIIH33yvpptIzT7&index=5 그동안은 성능과 상관없이 내가 원하는 대로 실행되면 빨리 다음 고고 였는데, 진행한 프로젝트도 쌓였고이제는 다음 단계로 넘어가야할 차례라고 생각했다. 한번 가려웠던 부분을 긁어보자. 1. @State & @Binding제일 간단한 State&Binding부터 살펴보자. 아래처럼 간단하게 뷰를 구성해보았다.struct StateBinding1View: View { ..
썸네일 [Swift] @Published 뷰모델을 Combine Subject로 바꿔보자 0. 서론기존 @Published로 작성된 계산기 코드를 Combine의 Subject로 바꿔보면서 학습한 것을 적어본다. 1. 기존 코드편안한 학습을 위해 간단한 정수 사칙 연산 로직을 가지고 있는 뷰모델을 짜보았다.final class CalcViewModel: ObservableObject { @Published var previewText = "" @Published var resultNumberText = "" private var operators: Set = ["+", "-", "*", "/"] enum Action { case numberTapped(String) case operatorTapped(String) case deleteTapped case ..
썸네일 [Swift] SwiftData Concurrency 사용하기 0. 서론SwiftData를 비동기 처리하려고 보면CoreData의 await context.perform 처럼 ModelContext를 비동기처리해주는 함수가 없는 것을 확인할 수 있다. 당연한 이야기 이지만 async 키워드를 붙이고 Task 블록 내에서 호출해도 메인 스레드에서 동작한다. 그럼 어떻게 하면 비동기 컨텍스트에서 실행시킬 수 있을까? 1. ModelActor와 Actor방법을 찾는 도중 @ModelActor라는 키워드를 발견했다. ModelActor가 그래서 뭔고?SwiftData의 ModelContext를 비동기/동시성 환경에서 안전하게 다루기 위해 설계된 구조로,데이터의 격리와 thread-safe한 처리를 자동으로 보장해주는 매크로 but, 이 친구를 사용하기 위해서는,,,,..
썸네일 [Swift] 스위프트 기본문법#4 - 튜플(Tuple) 이 글은 제가 앨런의 Swift 문법 강의를 듣고 작성한 글입니다! 1. 튜플이란? 튜플은 나의 임의의 연관된 데이터의 조합으로 어떤 형태든 만들 수 있는 타입이라고 할 수 있다! 또한, 변수를 선언과 동시에 해당 멤버는 결정되므로 추가/삭제는 불가능하다. // 튜플 기본 사용 let twoNumbers: (Int, Int) = (1, 2) // var로 선언시 반드시 같은 형태로! var threeValues = ("홍길동", 20, "서울") threeValues = ("김둘리", 24, "수원") 2. 튜플 기본 1) 데이터 접근 var threeValues = ("홍길동", 20, "서울") threeValues.0 // 홍길동 threeValues.2 // 서울 튜플의 데이터를 사용하려면 .으로..
썸네일 [Swift] 스위프트 기본문법#3 - 제어문 이 글은 제가 앨런의 Swift 문법 강의를 듣고 작성한 글입니다! 1. 반복문 for 문 for a in 1...10 { print(a) // 1, 2, ..., 8, 9, 10 } for b in (1...10).reversed() { print(b) // 10, 9, ..., 3, 2, 1 } for number in stride(from: 1, to: 15, by: 2) { print(number) // 1, 3, 5, 7, 9, 11, 13, 15 } 여기서 stride는 '성큼 성큼 걷다'라는 의미를 가지고 있다. while 문 var sum = 0 while num Bool { guard password.count >= 6 else { return false } // 로그인을 처리하는 cod..
썸네일 [통신 API] - Alamofire 연습(1) 사전준비 이 글은 개발하는 정대리님 유튜브 기반으로 작성합니다! 1. Alamofire에 사용할 api 준비하기 https://unsplash.com/ 에서 회원가입 후 menu -> product -> API/Developers -> 앱 생성 post man 다운 후 설치 -> 계정 생성 -> My Workspace 클릭 -> + 클릭 get부분에 https://api.unsplash.com/search/photos 넣고 아래 client_id - 아까 발급받은 키, query - 검색하고 싶은 단어 기입 후 send -> 아래 사진처럼 JSON 좌라락 뜨면 성공! 2. 초기 프로젝트 세팅하고 Alamofire 설치하기 적용할 프로젝트 생성 터미널을 켜서 프로젝트의 루트 폴더로 이동 -> pod init 입력 ..