
럽카이브 프로젝트를 진행하며 어떤 배열의 첫 멤버와 마지막 멤버만 사용해야 하는 로직을 작성해야 했다.first와 last를 사용해도 되지만, 이 둘은 옵셔널 값이기 때문에 옵셔널 바인딩이 필요하기 때문에 옵셔널 바인딩이 필요 없는 startIndex와 endIndex

기상청 API를 호출하여 XCTest로 호출 결과를 확인해보자이번에 새로 진행하는 프로젝트로, 끌밋(kkeulmit)이라는 프로젝트를 진행 중이다.이는 사용자가 설정한 시간과 요일마다 날씨를 점검하고 사용자에게 옷차림을 추천해주는 앱이다.이 앱의 핵심 중 하나는 날씨를

UIViewPropertyAnimator는 애니메이션을 '정의'하고, '시작하고', '일시정지'하거나 '취소'하고, '다시 시작'하는 등의 조작을 할 수 있는 객체이다. 이는 iOS 10부터 도입된 애니메이션 클래스로, 기존의 UIView.animate(...) 방식보

autoreleasepool은 Swift 및 Objective-C에서 메모리 관리를 최적화하기 위해 사용되는 기술이다. 특히 일시적으로 많은 객체를 생성하거나 반복 작업에서 메모리 사용량을 조절할 필요가 있을 때 유용하다.autoreleasepool은 생성된 객체를 일
@available은 Swift에서 API의 사용 가능 여부를 선언하는 속성(attribute)이다.이 속성을 사용하면 특정 플랫폼, 버전, 또는 전체 플랫폼에서 사용 가능/불가능 여부를 명시할 수 있다.platform: iOS, macOS, watchOS, tvOS

Coordinator 패턴은 iOS 애플리케이션의 화면 전환과 화면 흐름을 관리하기 위한 디자인 패턴이다.일반적으로 UIViewController가 화면 이동과 관련된 로직을 직접 담당하지만, 이 경우 UIViewController가 너무 많은 역할을 맡게 되어 특히

@dynamicMemberLookup은 Swift 4.2에서 도입된 속성(Attribute)으로, 특정 타입이 존재하지 않는 멤버(프로퍼티)에 접근하려고 할 때 컴파일러 오류를 발생시키는 대신, 사용자 정의 로직을 실행하도록 허용한다.즉, 런타임에서 멤버 접근을 '가로

Property Wrapper(프로퍼티 래퍼)는 Swift 5.1에서 도입된 강력한 기능으로, 프로퍼티에 재사용 가능한 로직을 캡슐화하고 해당 로직을 프로퍼티 정의에 직접 적용할 수 있도록 해준다.이를 통해 보일러플레이트 코드(여러 곳에서 거의 또는 전혀 변경하지 않고

UIKit을 활용하여 앱을 만들다보면 심심치 않게 아래와 같은 코드를 사용하게 된다.위 코드는 어느 ViewController의 뷰 내부에 SubView들을 한 번에 삽입하기 위해 사용하는 코드이다.forEach를 사용하지 않으면 아래처럼 반복해서 코드를 호출해야 하기
최근 RxSwift와 ReactorKit을 함께 사용하면서 고민에 빠진 것이 있다.RxSwift만 사용했을 때도 생각했던 것이지만, MVVM 패턴을 사용하게 되면 필연적으로 ViewModel을 만들거나 Reactor를 만들어서 사용하게 된다. 만드는 것 자체는 크게 어
lazy 키워드는 지연 저장 속성(Lazy Stored Property)을 선언하는데 사용된다. 이는 초기화 시점까지 계산이 필요하지 않은 복잡한 객체나 계산 비용이 큰 프로퍼티를 만들 때 특히 유용한다.보다 쉽게 설명하자면, lazy는 "필요할 때가 오면 그 때 초기
iOS 개발자가 되기 위해 문득 기본적인 개발 규칙을 지키는 것이 중요하지 않을까 생각이 들었다.그래서 가장 기본적인 내용이 되는 네이밍 규칙(Naming Convention)에 대해 작성하여 오래 기억할 수 있도록 하려고 한다.네이밍 규칙을 일관성 있게 지키는 것은

MVI 패턴은 함수형 및 반응형 프로그래밍 원칙을 기반으로 하는 아키텍처로, 단방향 데이터 흐름(Unidirectional Data Flow)을 극단적으로 사용하는 패턴이다. 복잡한 비동기 상태 관리를 예측 가능하고 디버깅하기 쉽게 만드는 것이 핵심이다.MVI 패턴은

✒️ 서론 일전에 MVC와 MVVM 등의 아키텍처 패턴을 공부하며 이 글에서 클린 아키텍처에 대해 가볍게 다룬 적이 있다. 이번에 새로 사이드 프로젝트에 참여하게 되었는데, MVI + Clean Architecture 패턴을 사용하는 프로젝트였기 때문에 클린 아키텍

개인 프로젝트를 진행하다가 특이한 오류를 발견했다.노란색 오류여서 빌드에 영향을 주지는 않겠지만, 처음 보는 오류였기 때문에 어떤 오류인지 알아보기 위해 검색을 해보았다.그 결과, 이 오류는 Never타입을 사용했을 때 발생하는 오류라고 한다. 그러나 나는 Never타

최근 새로 진행 중인 프로젝트를 열심히 진행 중인데, 기존 작업이 모두 SwiftUI로 되어있어서 몇가지 시행착오를 겪고 있다.지금까지는 UIKit만을 사용하는 협업을 주로 해왔기 때문에, SwiftUI로 만들어진 프로젝트에서 UIKit을 사용하여 협업하는 것이 처음이

Base가 되는 화면의 구현을 마치고 push를 통해 다른 뷰 화면으로 이동하기 위한 작업을 진행 중 뷰가 중첩되는 문제가 발생했다.분명 push를 1번 눌렀는데, 실제로는 5개의 view가 push되어 중첩되는 문제가 발생한 것이다.왜 이런 문제가 발생했고, 어떻게
Dependency Injection, 즉 의존성 주입은 객체 지향 프로그래밍(OOP)에서 결합도를 낮추고 유연성을 높이기 위한 설계 패턴이다.간단히 표현하자면, 어떤 객체 A가 다른 객체 B(의존성)를 필요로 할 때, A가 B를 직접 만들거나 찾아오는 대신, 외부(제
최근 채용 공고를 살펴보면 iOS 개발자에게도 CI/CD 경험은 이제 선택이 아닌 필수가 되고 있다. CI/CD는 개발부터 배포까지의 모든 과정을 자동화하여 개발팀의 효율을 극대화하는 소프트웨어 개발 방식이다.단어를 그대로 풀이하면 다음과 같다.CI (Continuou
Combine은 Apple이 WWDC 2019에서 발표한 프레임워크로, 시간이 지남에 따라 값을 처리하는 반응형 프로그래밍(Reactive Programming)을 구현하기 위해 탄생했다.쉽게 말해, 데이터의 흐름(스트림)을 선언적으로(Declaratively) 관리하
iOS 앱을 개발하면서 UITableView나 UICollectionView를 다룰 때 우리는 항상 IndexPath라는 객체를 마주하게 된다. 델리게이트 메서드에서 특정 셀을 지칭할 때나, 데이터를 꺼내올 때 indexPath.row 혹은 indexPath.item을
최근 SwiftUI로 View를 구현하는 작업을 하고 있는데, 화면 전환을 구현하다 보니 Coordinator를 사용 못하는 순간이 때때로 발생했다.이런 상황에서 pop동작을 실행하기 위해 dismiss를 사용했는데, sheet로 띄운 창을 닫을 때나 Navigatio
최근 SwiftUI 프로젝트에서 UIKit으로 구현한 뷰를 추가하기 위해 UIViewControllerRepresentable 타입을 구현한 경험이 있다.단순히 뷰 구현은 크게 어렵지 않고 잘 진행이 되었는데, 화면전환을 관리하면서 문제가 발생했다.메인이 SwiftUI
IdentifiedArray는 배열(Array)의 순서 보장 기능과 딕셔너리(Dictionary)의 빠른 접근성을 결합한 특수 컬렉션이다.성능: 특정 ID를 가진 요소를 찾을 때 O(1)의 속도를 보장한다.안전성: 인덱스가 아닌 고유 ID를 기반으로 요소에 접근하므로
iOS 개발을 하다 보면 특정 객체의 프로퍼티 값이 변경될 때 이를 실시간으로 감지하고 대응해야 하는 상황이 빈번하게 발생한다. 이러한 요구사항을 해결하기 위해 Apple은 Key-Value Observing (KVO)이라는 강력한 메커니즘을 제공한다. KVO는 Obj
Swift 5.5에서 도입된 Structured Concurrency는 iOS 개발의 패러다임을 바꿨다. 그중에서도 @MainActor는 UI 업데이트의 안전성을 컴파일 타임에서 보장해 주는 핵심적인 도구다. 기존의 DispatchQueue.main.async를 대체하
비동기 프로그래밍에서 가장 까다로운 적은 단연 데이터 레이스(Data Race)다. 여러 스레드가 동시에 같은 공유 자원에 접근하여 데이터를 수정하려 할 때 발생하는 이 문제는 예측 불가능한 버그와 크래시를 유발한다. Swift 5.5는 이를 언어 차원에서 해결하기 위

현재 진행 중인 프로젝트의 로그인 및 인증 관련 기능을 구현하던 중 발생한 트러블 슈팅을 정리한다.트러블슈팅 과정을 요약하자면 아래와 같다.문제 상황: AccessToken이 만료되었을 때 서버에 RefreshToken을 통해 토큰 재발급을 받아야 하는데, 사용자가 '
iOS 앱의 규모가 커지면 단일 타겟 프로젝트는 한계에 부딪힌다. 수천 개의 파일이 하나의 프로젝트 파일(.xcodeproj)에 얽히게 되면, 작은 수정에도 프로젝트 전체를 다시 인덱싱해야 하며 Git 협업 시 프로젝트 파일의 'Merge Conflict'는 개발자의
iOS 프로젝트를 진행할 때, 기본적으로 설정해줘야 하는 다양한 것들이 있다.그 중에서도 앱의 핵심이라고도 할 수 있는 API와 연결하는 네트워크 관리 객체의 구현은 필수적이다.UI를 먼저 만들고 네트워크를 구축하는 사람들도 있겠지만, 나는 네트워크 환경을 먼저 구축해