본문 바로가기

iOS

(53)
[Tuist] Tuist에 Contribute하기 - SwiftUI Font Template 지원 개발 중 느낀 SwiftUI Font의 필요성 최근 Tuist와 SwiftUI를 이용한 멀티플랫폼 프로젝트를 개발 중인데, tuist의 resource synthesizer가 제공하는 Font Template 내부에 SwiftUI의 Font가 존재하지 않아 편하게 사용할 수 있는 메서드가 존재하면 좋겠다고 생각했습니다. Image 또는 Color의 경우는 아래와 같이 SwiftUI의 struct를 가져올 수 있는 메서드가 존재했기에 필요성이 더욱 크게 느껴졌습니다. Fonts Template 파일을 살펴보니 swiftUIFont의 도입이 가능해 보였기에, tuist의 contribution guide를 읽기 시작했습니다. Tuist contributor guide 읽기 tuist는 나름 문서화가 잘 되어..
[Swift/Objc] NSCache 클래스 분석하기(feat. objc 문법 이해해보기) 최근에 이미지 캐싱 기능을 라이브러리 없이 구현해보고자 여러 레퍼런스들을 분석중이었습니다. Swift에서 캐싱을 위해 제공하는 기본적인 API로 NSCache가 존재합니다. 공식 문서를 보면 NSCache는 count 및 cost를 통해 object를 관리하는 caching policy를 제공한다고 합니다. 이 클래스는 Foundation Framework에 속하기 때문에, apple이 2023년부터 github에 공개한 Foundation framework의 swift implemetation을 확인 가능합니다. 다른 방식의 구현을 확인하고 싶다면, GNUStep Base Libary를 확인할 수 있습니다. GNUstep is a mature Framework, suited both for advanc..
[iOS] InjectionIII로 UIKit에서 Hot Reload 사용하기 Hot Reloading Hot Reload란 어플리케이션 개발 시 코드를 변경하고, 런타임에서 변경 사항을 즉시 반영하는 것을 말합니다. 일반적인 UIKit의 개발 과정은 다음과 같습니다. 요구 사항 변경 or 오류 발생 -> 코드 수정 -> 빌드 및 어플리케이션 재실행 -> 어플리케이션 반영 확인 이처럼 개발 과정에 있어 코드를 수정하는 시간 외에도 빌드 및 어플리케이션을 실행하는 시간을 들여야 합니다. 만약 이러한 과정의 일부를 줄일 수 있다면 디버깅 시간이 줄어들고, 결국에는 생산성 향상을 도모할 수 있을 것입니다. SwiftUI의 preview 기능은 Hot Reload와 비슷한 부분이 있습니다. preview는 변경 사항을 작성하고, UI의 변동을 실시간으로 확인할 수 있게 합니다. 주요한 차..
[Swift] Modern Concurrency Swift ( 3편 - async-await 알아보기 ) Modern Concurrency Swift ( 1편 - Thread Class로 Thread 문제 파헤치기 ) Modern Concurrency Swift ( 2편 - GCD와 Operation의 특징과 문제점 요약 ) 지난 2편의 글에서는, Thread Class부터 시작하여 GCD 및 Operation까지, iOS에서의 전통적인 멀티스레딩 방식에 대해 알아보았습니다. 본문은 WWDC 및 Swift Evolution을 참고하여 작성했습니다. async-await 앞서 알아본 기존의 멀티스레딩 방식들이 가진 문제점을, Swift Concurrency가 해결할 수 있는지 알아보기 전에 Swift Concurrency의 기본이 되는 async-await에 대해 알 필요가 있습니다. async-await는 ..
[Tuist] Interface Module을 사용하여 domain을 여러 Features로 분리하기 현재 진행 중인 프로젝트에서 Feature가 단일화된 상태에서 Scene Flow를 기준으로 하여 여러 Features로 분리하는 작업 중에 있습니다. 아래의 아이디어를 기준으로 구현했습니다. 앱 구현 특성 상 서로 다른 Feature의 명세가 필요할 때가 있습니다. 이때 구현 모듈이 서로를 직접 참조하게 되면 순환 참조가 생길 수도 있고, 모듈 간의 결합도도 강해집니다. 따라서 구현 모듈 간에 직접 의존하지 않게 만들기 위해 Interface 모듈을 도입했습니다. Interface 모듈 내부에는 ViewController를 추상화 할 수 있는 Protocol을 정의하여, 다른 Feature에서 참조하여 viewController를 생성할 수 있도록 하고자 했습니다. 추상화된 인터페이스와 의존성의 조립은..
[SwiftUI/TCA] CMPedometer, AsyncThrowingStream, TCA dependencies 라이브러리로 만보기 기능 구현하기 현재 진행중인 프로젝트에서 실시간으로 걸음수를 업데이트하는 기능을 구현해야 했습니다. 프로젝트 스펙은 tuist 모듈화 및 TCA 아키텍쳐를 사용하고 있었기 때문에, TCA에 내장된 dependencies 라이브러리로 의존성을 관리하고자 했습니다. 걸음 수 데이터 가져오기 걸음 수 데이터는 HealthKit 또는 CoreMotion의 CMPedometer를 이용하여 가져올 수 있습니다. HealthKit을 이용하기 위해서는 사용자의 건강 정보에 접근 권한을 가지고 있어야하며, CoreMotion의 경우 Motion 정보 접근 권한을 허가받아야 합니다. CMPedometer를 이용할 경우 HealthKit보다 더욱 빠르게 sync되는 걸음수 데이터를 얻을 수 있기 때문에, 실시간 만보기를 구현해야 하는 입..
[SwiftUI] Managing Data by Property Wrappers (@State, @StateObject, @ObservedObject, @EnvironmentObject) SwiftUI가 기존 UIKit과 비교하여 크게 다른 점 중 하나는, State를 관리할 수 있는 Property Wrappers가 기본적으로 제공된다는 것입니다. 가장 기본적인 @State부터 시작하여, @StateObject, @ObservedObject, @EnvrionmentObject까지 언뜻 비슷하지만 확연히 다른 성질을 가지고 있습니다. 특성과 용도에 대해 헷갈릴 수 있는 부분이 있어 위의 4가지 프로퍼티 래퍼에 대해 간단히 요약해보려고 합니다. 먼저 @State에 대해 알아보겠습니다. @State A property wrapper type that can read and write a value managed by SwiftUI. @frozen @propertyWrapper struct S..
[Needle] Uber의 Needle로 컴파일 타임에 안전한 의존성 주입 환경을 구현하기 의존성 주입(dependency injection)의 필요성과 일반적인 문제점 DI, 의존성 주입은 객체 지향 프로그래밍에서 책임을 분리하고, 확장에 유연하게 만들어주는 핵심적인 패턴 중의 하나입니다. 의존성 주입의 장점은 다음과 같습니다. 1. Class와 Structure의 요구사항과 책임이 더욱 분명하고 명확해진다. 2. 의존성을 Mock으로 교체하여 Unit Test를 수행하기 편리해진다. 3. 의존성 주입을 받는 객체는 해당 의존성에 대한 책임을 지지 않으면서도 그 의존성의 기능을 사용할 수 있다. 4. Protocol을 사용하면 프로젝트에 존재하는 Coupling을 제거할 수 있다. 5. 여러 개발자가 분리된 객체에 대한 동시 작업이 가능해진다. 물론 장점만 있는 것은 아닙니다. 프로그래머의 ..
[iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (6편 - Fastlane, github actions로 tuist project의 CI/CD 구현) [iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (1편 - CI/CD란 무엇일까?) [iOS] Fatslane + Github Actions로 CI/CD 파이프라인 구축하기 (2편 - Github Actions 살펴보기) [iOS] Fatslane + Github Actions로 CI/CD 파이프라인 구축하기 (3편 - fastlane으로 TestFlight에 앱 업로드하기) [iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (4편 - fastlane match로 인증서와 profile을 git 저장소에 관리하기) [iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (5편 - Tuist..
[iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (5편 - Tuist와 Fastlane 함께 사용하기, xcconfig과 schemes, match 설정) [iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (1편 - CI/CD란 무엇일까?) [iOS] Fatslane + Github Actions로 CI/CD 파이프라인 구축하기 (2편 - Github Actions 살펴보기) [iOS] Fatslane + Github Actions로 CI/CD 파이프라인 구축하기 (3편 - fastlane으로 TestFlight에 앱 업로드하기) [iOS] Fastlane + Github Actions로 CI/CD 파이프라인 구축하기 (4편 - fastlane match로 인증서와 profile을 git 저장소에 관리하기) Tuist 프로젝트에 match 적용하기 tuist로 프로젝트를 생성하면 build setting을 설정해주지..