-
[Swift] \. 는 무엇인가 (KeyPath 정리)Swift 2023. 3. 23. 20:19
시작하며
SwiftUI tutorial을 보던 중 \. 라는 표현이 등장 했다. 처음 보는 표현이라 당황하였지만 언제는 친절한 스위프트 튜토리얼이었나 생각하며 구글링을 통해 정리해 보려 한다.
KeyPath
- syntax: \BaseType.PropertyName
- Base타입은 타입 추론에 의해 추론할 수 있는 경우 생략해서 \.propertyName과 같이 사용한다.
- KeyPath는 값에 대한 참조가 아닌 프로퍼티에 대한 참조이다. 말 그대로 어떤 타입의값에 대한 path를 표현한다.
- 변수는 KeyPath와 달리 값에 대한 참조를 하기 때문에 변수를 사용하면 값에 전근할 수 있다.
- KeyPath의 표현식은 \ (백슬래시) 로 시작한다.
예시
struct Person { var name: String } let austin = Person(name: "austin") //let name = austin[keyPath: \Person.name] 타입 추론 전 let name = austin[keyPath: \.name]
5가지 KeyPath
- AnyKeyPath : 타입이 지워진 KeyPath
- PartialKeyPath : 부분적으로 타입이 지워진 KeyPath
- KeyPath<Source, Target> : Read-only
- 프로퍼티가 let으로 선언된 경우
- WritableKeyPath<Source, Target> :
- value-type 인스턴스에 사용가능
- 변경 가능한 모든 프로퍼티에 대한 read-write access 제공
- 프로퍼티가 var로 선언된 경우
- ReferenceWritableKeyPath<Source, Target> :
- 클래스의 인스턴스에 사용 가능
- 변경 가능한 모든 프로퍼티에 대한 read-write access 제공
- 프로퍼티가 var로 선언된 경우
요약
- . 을 통해 객체의 value에 접근 했다면 \BaseType.을 통해 프로퍼티 자체에 접근해서 key에 대한 값을 가져 올 수 있게 한다.
- \BaseType. 에서 타입 추론이 가능한 경우 \. 와 같이 사용한다.
- 객체 내부에 let과 var를 사용 여부에 따라 읽기 가능과 읽기-쓰기 가능으로 구분된다.
ref
https://techblog.woowahan.com/2715/
알아두면 쓸모 있는 Swift의 기능들 | 우아한형제들 기술블로그
{{item.name}} Swift는 C와 Objective-C와의 연동은 뛰어나지만 JS, Python 과 같은 dynamic 언어들과는 상대적으로 떨어집니다. 그 이유들로 추가되고 있는 기능들이 있습니다. KeyPath, dynamicMemberLookup 등 Swift의
techblog.woowahan.com
https://zeddios.tistory.com/1218
Key-Value Coding(KVC) / KeyPath in Swift
안녕하세요 :) Zedd입니다. 오늘은 KVC에 대해서 공부해보겠습니다. # KVC - Key-Value Coding 의 약자 - 객체의 값을 직접 가져오지않고, Key 또는 KeyPath 를 이용해서 간접적으로 데이터를 가져오거나 수정
zeddios.tistory.com
https://80000coding.oopy.io/2c9f09c6-8162-4336-b8fe-a2d2d721f5ae
(Swift) 이름은 모르지만 어쨌든 "\." 에 대한 포스팅 (feat. KeyPath)
SwiftUI 튜토리얼을 따라하다가 아래와 같은 코드를 보게되었다.
80000coding.oopy.io
'Swift' 카테고리의 다른 글
[Swift] Codable 개념 확실히 이해하기 💬 (0) 2023.10.06 [Swift] defer는 무엇인가 🤔 (0) 2023.10.03 [SwiftUI] @State와 @ObservableObject 알아보기 (0) 2023.03.21 [Network] URL로 네트워크 요청하기 (0) 2023.03.12 [Swift] @escaping 키워드와 클로저 (0) 2023.03.11