Swift에는 특정 타입에 대해서 런타임에서 조사할 수 있도록 하는 기능이 있습니다. 이를 Reflection이라고 합니다. Reflection은 특정 타입에 대해 해당 타입이 무엇이고 그 타입이 가지는 프로퍼티들을 알려주기 때문에 디버깅에서 주로 쓰입니다. 공식 문서에서도 디버깅과 리플렉션이 같이 수록되어 있습니다. Debugging and Reflection Fortify your code with runtime checks, and examine your values' runtime representation 그럼 Reflection이 뭔지에 대해 더 알아보도록 하겠습니다. Reflection을 썼을 때의 차이점 먼저 reflection을 사용했을 때 어떤 장점이 있는지 간단하게 살펴보도록 하겠습니..
Swift

이름에서 유추할 수 있듯이, 데코레이터 패턴은 특정 객체에 추가적인 기능을 덧붙여서 꾸며주는 기능입니다. 데코레이터 패턴을 사용하면 유연하면서 깔끔한 구조로 하나의 추상적인 동작에 대한 구체 기능들을 조합할 수 있습니다. 저는 디자인 패턴들의 정의를 볼 때 다이어그램과 글로 된 정의들을 보면 이해가 잘 안 가는 경우가 많았습니다. 따라서 정의를 보기전에 먼저 예제를 통해서 데코레이터 패턴이 무엇이고 어떤 특징을 가지고 있는지에 대해 알아보겠습니다. 단순 구현하기 특정 기능을 수행하던 중 에러가 발생했을 때 에러를 기록하는 ErrorLogger 객체가 있습니다. 이 객체는 에러가 발생하면 에러를 저장하여 나중에 꺼내서 확인해 볼 수 있도록 하는 역할을 하고 있습니다. class ErrorLogger { f..
드디어 스위프트에도 매크로가 등장했습니다. 저는 평소에도 안드로이드나 서버에서 쓰고 있는 어노테이션들을 보면서 스위프트에도 있었으면 좋겠다고 생각을 많이 했었는데요, 매크로를 구현해 보면서 알게 된 것들을 정리해 보겠습니다. 매크로 시작하기 매크로의 종류와 어떻게 만드는지는 WWDC 영상과 몇몇 예시들만 참조하면 익히실 수 있습니다. 저는 처음에 예시만 보고 바로 하려니까 매크로의 종류나 과정이 잘 이해가 안 돼서 힘들었던 경험이 있어서 시작하시기 전에 아래 WWDC 영상은 보는 것을 추천드립니다. https://developer.apple.com/videos/play/wwdc2023/10167 Expand on Swift macros - WWDC23 - Videos - Apple Developer Di..

앱의 구조가 복잡해지고 깊어질 수록 pure DI로 디펜던시들을 주입해주기 위해서 많은 노력들이 들어갑니다. Composition Root에서부터 필요한 부분까지 디펜던시들을 전달하기 위해 중간에서도 디펜던시를 관리해주어야 하기 때문이죠. 이를 해결하기 위해 pointfree에서는 DI Container 역할을 하는 라이브러리를 만들었습니다. 원래는 ReducerProtocol과 함께 제공되던 Dependencies 라이브러리가 TCA를 사용하지 않아도 사용할 수 있도록 별도의 라이브러리로 분리되면서( 이미 분리된지 시간이 좀 지났습니다 ) DI library로 swift dependencies를 도입할 지 고민인 분들을 위해 이 라이브러리의 간략한 소개와 이를 사용하면서 느낀 점들을 정리해보고자 합니다..
모바일 앱들은 사용자들과 직접 맞닿아 있는 창구로서, 많은 앱들이 결제 기능을 지원합니다. 앱 자체가 유료인 경우도 있지만, 앱 내부에서 상품을 판매하는 경우가 많습니다. 이러한 결제는 어떻게 구현할 수 있을까요? iOS에서 결제는 StoreKit을 사용하여 구현됩니다. 아직 StoreKit에 대해서 잘 모르시는 분들(저요)이 개념과 흐름을 이해하는데 도움이 되기 위해 StoreKit의 각 문서들을 요약하여 전체적인 결제의 과정과 그 구현에 대해서 정리하였습니다. 상품 ID가져오기 모든 상품에는 product identifier가 있습니다.(상품을 등록할때 정해줘야 합니다) 이 product identifier를 앱 번들이나 서버에 저장했다가 이것을 사용해 앱스토어에서 상품의 정보들(가격 등)을 가져올 ..
스냅샷 테스트란 특정 상태에서의 화면을 그려 이미지로 저장해놓고 테스트를 돌릴 때마다 다시 특정 상태에서의 화면을 그려 이미지로 만든 후 기존에 저장된 이미지와 픽셀 비교를 하여 달라진 부분이 있는지를 확인하는 테스트 기법입니다. 스냅샷 테스트를 적용하면 손쉽게 UI에 대한 테스트를 해볼 수 있습니다. 스냅샷 테스트 라이브러리 스냅샷 테스트 라이브러리는 크게 두 가지가 있습니다. 우버의 iOSSnapshotTestCase와 포인트프리의 SwiftSnapshotTesting 입니다. 우버 라이브러리는 페이스북에서 만든 FBSnapshotTestCase의 명맥을 유지하면서 이어져오는 라이브러리이기도 합니다. 둘다 쓰임새와 사용법은 비슷합니다만 SwiftSnapshotTesting은 뷰뿐만 아니라 다른 것들도..

SwiftUI에서는 alignmentGuide 메소드를 통해 정렬 기준을 커스터마이징할 수 있습니다. 이를 통해서 우리는 단순히 제공되는 정렬이 아닌, 우리만의 기준으로 뷰들을 정렬시킬 수 있습니다. func alignmentGuide(g, computeVlue) -> some View alignmentGuide 메소드는 g와 computeValue 두 가지 인자를 받습니다. g는 HorizontalAlignment 또는 VerticalAlignment인데, 해당 Alignment에 대한 정렬 기준을 나타낸다는 뜻입니다. 예를들어 g에 HorizontalAlignment.leading를 주게 되면 HorizontalAlignment.leading에 대한 기준을 alignmentGuide를 통해 커스텀한다..

스켈레톤 뷰 구성 하기 스켈레톤 뷰는 기존 뷰에 isSkeletonable을 통해 별다른 추가 작업없이 스켈레톤 스크린을 구현할 수 있게 해줍니다. 하지만 스켈레톤 뷰를 몇 번 사용해보니 우리가 정학히 원하는 모양을 잡기 위해서 기존의 뷰를 그대로 활용하기가 애매해지는 부분이 있었습니다. 기존의 뷰의 크기가 고정되어 있지 않고 동적인 경우, 스켈레톤 뷰를 위해서 스켈레톤을 띄우는 동안에는 원하는 크기로 고정을 시켜주어야 합니다. 예를 들어, width를 잡지 않고 사용하는 UILabel의 경우, text 크기에 따라서 width가 정해지게 됩니다. 이 label에 스켈레톤을 적용하려면, width를 잡아주거나, 일정 크기만큼의 dummy text를 넣어주어야 합니다. 이는 내가 원하지 않은 설계가 되거나..