SwiftUI에서 ForEach를 통해 반복되는 UI를 구성할때 `id: \.self`나 `id: \.id`와 같은 코드를 본 적이 있을것이다.나는 이 코드의 의미에 대해 궁금해졌다. 이번 글에서는 SwiftUI의 Identity(동일성)에 대해 알아보고, 다음 글에서는 KeyPath에 대해 알아보도록 하겠다.SwiftUI의 IdentitySwiftUI가 뷰를 그리는 방식은 다음과 같다.`@State`등의 Source of Truth가 되는 프로퍼티가 변화하면 body 프로퍼티가 다시 렌더링 되면서 View가 다시 그려진다. 즉, `@State` 변수의 값이 변경되면 뷰가 해당 값을 반영한 형태로 다시 그려지는 것이다.그렇다면, 어떻게 같고 다른것을 구분할 수 있는 것일까? 이 때 등장하는 개념이 Ide..
지난 글에 이어서 Swift의 Test에 대해 더 알아보겠다. 테스트에서 가장 중요한 점은 몇 번의 테스트를 하든 동일한 결과가 나와야 한다는 점이다.그런데 네트워크 통신 메서드의 경우 서버의 상황에 의해서 테스트가 실패할 가능성이 생긴다.즉, 네트워크 통신 테스트의 유의점은 다음과 같다.네트워크 통신이 잘 되는 상황에 대해서만 일관적인 결과를 얻을 수 있다.통신에 문제가 있는 경우 결과가 달라질 수 있다. 즉, 외부 환경에 영향을 받는다.네트워크 통신과 무관한 상태로 테스트 코드를 작성하는게 중요하다.이러한 특징 때문에 네트워크 통신을 추상화하고, 실제 데이터가 아닌 Mock 데이터로 테스트를 하는게 중요하다. 이때 사용하는게 Test Double이라는 객체이다.Test Double이란 실제 객체 대신..
앱을 개발하다보면 UI에 문제는 없는지, 혹은 특정 기능이 잘 작동하는지 검증을 해야 한다.규모가 작은 앱이라면 기기에 빌드해서 전체 기능을 직접 테스트 해볼 수는 있..겠으나,기능이나 화면이 너무 많은 경우나, 여기에 작은 기능 하나만 추가되었을 때 A부터 Z까지 전부 다 직접 테스트하는것은 비효율적일 것이다. 그래서 Swfit는 XCTest(혹은 SwiftTesting)를 통해 UI/기능을 테스트할 수 있는 프레임워크를 제공한다. 이번 글에서는 Test에 대한 소개와 함께 Testable한 코드에 대해서 알아보도록 하겠다. Test 알아보기먼저 Test의 목적과 종류에 대해 알아보겠다.Test는 말 그대로 "앱을 사용함에 있어 문제가 없는지를 확인"하는 과정이다.이러한 개념은 당연히 iOS에만 있는 ..
네트워크 통신을 통해 이미지를 받아와야 하는 경우지금까지는 Kingfisher라는 라이브러리를 사용해 해당 이미지를 처리했었다. 그러던 와중에 외부 라이브러리를 쓰지 않고, 이미지를 로드하고 캐싱하는 기능을 구현하고 싶었다. 이번 글에서는 이미지 캐싱에 대해 알아보고, MemoryCash와 DiskCashe를 실제로 구현해보도록 하겠다.이미지 캐싱이란?먼저 캐시라는 개념에 대해 알아보도록 하자.캐시는 컴퓨터 과학 에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다.캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.즉, 캐싱이란 데이터를 미리 캐시라는 별도에 장소에 복사해놓고, 이후에 접근할 때 더 빠른속도로 접근할 수 있게 하는 것을 말한다. 예를..
Combine을 살펴보면 RxSwift에서 용어만 바뀐 느낌이 든다.예를 들어RxSwift에서의 Observable은 Combine에서 Publisher이고,Observer는 SubscriberDisposable은 AnyCancellable...이런 식으로 말이다. 물론 더 깊이 들어가면,RxSwift는 class기반이고, Combine은 protocol 기반,Combine에서는 에러 대응을 항상 해줘야 함.. 등차이점은 더 있을 수 있겠으나, 대부분 RxSwift와 1:1로 대응해서 생각하면 이해하기는 어렵지 않았다. 그런데, 그 중 궁금증이 생긴 부분이 있었다.RxSwift에서의 `.disposed(by: disposeBag)` 부분에 해당하는 코드가 Combine에서는 `.store(in: &can..
Swift의 의존성 주입과 관련해서 DI와 DIP라는 용어를 듣게 될 것이다.처음에는 DI나 DIP나 그냥 의존성 주입을 하는 애구나.. 정도로만 알고있었다.그런데, 좀 더 자세히 알아보니 이 둘은 (당연히) 서로 다른 개념이며, 의존성 주입을 해야하는 이유에 대해서도 생각해보게 되었다. 이번 글에서는 DI와 DIP에 대해 알아보도록 하겠다. DI (Dependency Injection)DI는 Dependency Injection의 약어로, 의존성 주입을 뜻한다.먼저 DI가 필요한 상황과, 그 방법에 대해 알아보자. A클래스가 B클래스에 의존하는 상황이라면, B클래스에서 변화가 일어날 때 A클래스에까지 영향을 미치는 상황이 있다./*Guest 클래스는 A_Restaurant 에, A_Restaurant는..