Key-Path Expressions | Apple Developer Documentation
Use key-path expressions to access properties dynamically.
developer.apple.com
KeyPath Expressions API?
키 경로 표현식을 사용하여 프로퍼티에 동적으로 액세스하기
말이 너무 어렵다… 코드를 보는게 이해가 더 쉬웠다.
struct SomeStructure {
var someValue: Int // -> 이게 프로퍼티
}
let s = SomeStructure(someValue: 12)
let pathToProperty = \SomeStructure.someValue // 이게 표현 식
let value = s[keyPath: pathToProperty] // 이 프로퍼티로 someValue의 값에 접근
// value is 12
Key Path의 장점
- 간결하게 코드에 접근 할 수 있다. → 거의 이게 다 임..!
- 인스턴스 전체가 아닌 일부 프로퍼티에 값을 사용할 때
- 프로퍼티를 “문자열”이 아닌 특정 표현 식으로 간결하게 접근할 수 있다.
- KeyPath를 통해 컴파일 타임 시점에 동적으로 엑세스가 가능함
KeyPath Expressions API Collections
Swift는 KeyPath를 다양한 사용에 알맞게 지원하기 위해 총 5개의 class 타입으로 제공함
KeyPath
⇒ 가장 일반적인 KeyPath API
- 인스턴스 값에 접근하기 위해 주로 사용한다.
- 이 프로퍼티를 갖고 있는 인스턴스 타입을
Key
로, 프로퍼티 타입Value
로 갖으며 컴파일 타임에 추론한다.
let pathToProperty:KeyPath<SomeStructure,Int> = \SomeStructure.someValue // 이게 표현 식
PartialKeyPath
⇒ 인스턴스 타입 알 수 있는 KeyPath API
- 이 인스턴스의 하위 프로퍼티 타입이 무엇인지는 추론하지 않는다.
- 인스턴스가 해당 프로퍼티를 갖고 있음을 알 수 있다.
AnyKeyPath
⇒ 인스턴스 타입과 하위 프로퍼티 타입이 무엇인지 모르는 API
- SwiftUI의 AnyView와 비슷한 역할을 한다.
- as 타입 캐스팅으로 지정 KeyPath로 변환할 수 있다.
- 사용할 순 있으나 굳이..?
WritableKeyPath
⇒ 결과 값에 대한 읽기 및 쓰기를 지원하는 키 경로입니다.
- KeyPath는 접근만 가능 하지만, WritableKeyPath는 값을 수정할 수 있다.
- 해당 인스턴스가 불변, 가변인지가 중요하다. 참조 타입인지, 값 타입인지는 중요하지 않다.
❌ 사용할 수 없는 경우
상수일 때는 값을 바꿀 수 없다..!
struct TimerRecordItem {
var duration: Int = 0
}
let timerItem = TimerRecordItem(duration: 2)
let writable: WritableKeyPath<TimerRecordItem, Int> = \TimerRecordItem.duration
timerItem[keyPath: writable] = 2 // 여기서 에러 난다..!
✅ 사용 예시
struct TimerRecordItem {
var duration: Int = 0
}
var timerItem = TimerRecordItem(duration: 2)
let writable: WritableKeyPath<TimerRecordItem, Int> = \TimerRecordItem.duration
timerItem[keyPath: writable] = 2 // 여기서 에러 난다..!
ReferenceWritableKeyPath
- 참조 타입(class)에만 접근하고 파라미터 값을 바꿀 수 있는 KeyPath
- Actor 같은 경우는 파라미터 값 자체의 원자성을 보장하기 위해 KeyPath 변경이 안됨…
참고 자료
https://woozoobro.medium.com/swift%EC%97%90%EC%84%9C-key-path-
%ED%91%9C%ED%98%84%EC%8B%9D-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-5956923a8976
https://ios-development.tistory.com/982
https://green1229.tistory.com/172
+ Swift 공식 문서..!
댓글