작은 앱 프로젝트

오직 필요한 기능만 제공하는 '작은 앱'을 디자인하고 개발합니다.

swift 2

[Swift 문법] Generics - Associated Types 💡✨

[Question] 아래 프로토콜(protocol)에서 fetchData() 함수의 반환 타입 [String]을 String 외의 다른 타입도 쓸 수 있도록 해 프로토콜의 재사용성을 높이는 방법은?protocol DataFetchable { func fetchData() async throws -> [String]}  [Answer] 아래 코드처럼 Swift 제네릭(Generics)의 연관 타입(Associated Types)을 활용한다. 이렇게 하면 구체적인 타입을 나중에 지정할 수 있게 돼, 다양한 상황에 맞게 재사용할 수 있는 유연성이 생긴다.protocol DataFetchable { associatedtype FetchedDataType func fetchData() async ..

Swift 문법 2024.06.23

Swift 동시성 코드 Race Condition 버그 해결 과정 💡✨

iOS 앱을 개발하면서 얻은 지식과 깨달음, 그 과정에서 겪은 시행착오를 공유합니다. iOS 캘린더(달력) 앱 스케줄러에는 '기본 캘린더' 기능이 있다. 애플 캘린더 등 외부 캘린더를 연동한 뒤, 연동한 캘린더에 일정 등록 시 가장 자주 쓰는 캘린더가 선택돼 있도록 하는 설정 기능이다. 이 기능은 연동 캘린더에 일정을 등록할 때 나타나는 아래 편집기의 '캘린더 선택' 부분에 사용자가 설정한 '기본 캘린더'가 선택돼 있도록 한다.    💡 경쟁 상태(Race Condition)로 발생한 문제 해결 과정 그런데 '가끔' 다른 캘린더가 선택돼 있을 때가 있었다. '가끔'이라는 표현이 중요하다. 항상 그런 게 아니었다. 대부분의 경우 정상적으로 동작했다. 어떻게 디버깅해야 할 지 감이 안 잡혔다. 가끔일지라도..

Concurrency 2024.06.20