이번 글은 지난 글에 이어서ForEach문의 `\.self`, `\.id`의 의미에 대해 계속 알아보도록 하겠다. Swift의 KeyPath 문법에 대해 알아보자. Key Path 문법이란?KeyPath 문법의 형태를 보면 \.~~ 이런 식으로 작성되어 있는데 이는 컴퓨터에서 특정 경로를 표시할 때 본 적이 있을 것이다. 터미널에서도 특정 폴더로의 경로를 나타날때 백슬래시를 통해 표시하는 것을 볼 수 있다. 이와 마찬가지로 KeyPath는 어떤 특정한 타입이 가진 프로퍼티에 접근할 때 "경로를 통해서 접근"하는 것을 표현하는 방식이라고 볼 수 있다. 예를 들어 `User`라는 구조체가 있고, 그 안에 `name`이라는 String 타입의 변수가 있을 때 다음과 같이 접근할 수 있다는 뜻이다.`\User...
SwiftUI에서 ForEach를 통해 반복되는 UI를 구성할때 `id: \.self`나 `id: \.id`와 같은 코드를 본 적이 있을것이다.나는 이 코드의 의미에 대해 궁금해졌다. 이번 글에서는 SwiftUI의 Identity(동일성)에 대해 알아보고, 다음 글에서는 KeyPath에 대해 알아보도록 하겠다.SwiftUI의 IdentitySwiftUI가 뷰를 그리는 방식은 다음과 같다.`@State`등의 Source of Truth가 되는 프로퍼티가 변화하면 body 프로퍼티가 다시 렌더링 되면서 View가 다시 그려진다. 즉, `@State` 변수의 값이 변경되면 뷰가 해당 값을 반영한 형태로 다시 그려지는 것이다.그렇다면, 어떻게 같고 다른것을 구분할 수 있는 것일까? 이 때 등장하는 개념이 Ide..
SwiftUI에서 Stack을 사용할때 일반적인 VStack, HStack을 사용하기도 하며,Lazy라는 키워드가 붙은 LazyVStack, LazyHStack을 사용하기도 한다. 이번 글에서는 이 둘의 ScrollView 내부에서의 차이와, 메모리 관점에서의 차이에 대해 알아보도록 하겠다. ScrollView 내부에서의 차이VStack으로 다음과 같은 뷰를 구성했을때와, LazyVStack으로 구성했을 때 가장 먼저 느껴지는 차이는 "스크롤이 되는 영역"이 다르다는 것이다.struct Row: View { let id: Int var body: some View { Text("Row \(id)") } init(id: Int) { self.id..
접근 제어(Access Control)는 다른 소스 파일과 모듈 등에서 코드 접근에 대해 제한하는 기능이다.접근 제어를 통해 코드의 세부 구현을 숨길수도 있으며, 어디에서까지 해당 코드에 접근할지 범위를 설정할 수 있다. 우리가 흔히 알고있는 Swift의 접근제어자는 5가지가 있다. `private` : 선언된 파일 내에서만 접근 가능`fileprivate` : 같은 파일 내 모든 스코프에서 접근 가능`internal` : 같은 모듈(타겟) 내에서만 접근 가능`public` : 다른 모듈에서도 접근 가능`open` : public과 같으면서, 서브클래싱 및 오버라이드까지 허용 그런데 Swift5.9에서 `package`라는 새로운 접근제어자가 등장했다. 이번 글에서는 이 package 접근제어자에 대해 ..
프라이버시는 애플에서 가장 강조하는 키워드 중 하나이기도 하며,사용자의 입장에서도 앱을 사용함에 있어 자신의 개인정보가 보호되길 기대할 것이다. 그래서 위치기반 서비스가 있다면 사용자에게 위치 권한을 요청해야 하며,카메라로 사진을 찍는 서비스가 있다고 하면 이때 역시 권한을 요청해야 할 것이다. 그런데, 앱을 개발하면서 의문이 든 부분이 있었다.바로 사진 첨부 기능을 추가할 때 별도의 권한 요청이 필요 없었기 때문이다. 분명 사용자는 자신의 갤러리를 열어서, 여러 사진중에 선택을 할텐데이때는 왜 갤러리 접근 권한을 요청하지 않는 것일까? 사진에 비공개 접근프라이버시와 권한 요청에 대해 잘 모를때는 사진 첨부 기능을 위해 권한 요청을 해야 한다고 생각했다.그리고 실제로 Info에서 다음과 같은 Privac..
지난 글에 이어서 Swift의 Test에 대해 더 알아보겠다. 테스트에서 가장 중요한 점은 몇 번의 테스트를 하든 동일한 결과가 나와야 한다는 점이다.그런데 네트워크 통신 메서드의 경우 서버의 상황에 의해서 테스트가 실패할 가능성이 생긴다.즉, 네트워크 통신 테스트의 유의점은 다음과 같다.네트워크 통신이 잘 되는 상황에 대해서만 일관적인 결과를 얻을 수 있다.통신에 문제가 있는 경우 결과가 달라질 수 있다. 즉, 외부 환경에 영향을 받는다.네트워크 통신과 무관한 상태로 테스트 코드를 작성하는게 중요하다.이러한 특징 때문에 네트워크 통신을 추상화하고, 실제 데이터가 아닌 Mock 데이터로 테스트를 하는게 중요하다. 이때 사용하는게 Test Double이라는 객체이다.Test Double이란 실제 객체 대신..