Swift 4에서 도입된 KeyPath는 속성이나 서브스크립트에 대한 참조를 나타내는 안전한 방법이다. KeyPath를 사용하면 속성의 이름을 직접 사용하는 대신에 키 경로를 통해 속성에 접근할 수 있다. 이를 통해 컴파일러가 키 경로의 유효성을 검사하고 타입 안정성을 보장할 수 있다.
KeyPath는 세 가지 주요 유형으로 분류된다.
- KeyPath to a Property (속성에 대한 KeyPath): 이 유형의 KeyPath는 특정 타입의 속성에 대한 참조. 예를 들어, KeyPath<Person, String>는 Person 타입의 String 속성에 대한 KeyPath이다.
struct Person {
var name: String
var age: Int
}
let person = Person(name: "John", age: 30)
// 속성에 대한 KeyPath
let nameKeyPath = \\Person.name
let ageKeyPath = \\Person.age
let name = person[keyPath: nameKeyPath]
let age = person[keyPath: ageKeyPath]
print("Name: \\(name), Age: \\(age)") // Output: Name: John, Age: 30
- KeyPath to a Subscript (서브스크립트에 대한 KeyPath): 이 유형의 KeyPath는 특정 타입의 서브스크립트에 대한 참조. 서브스크립트의 인덱스를 사용하여 요소에 접근할 수 있다. 예를 들어, KeyPath<Array<Int>, Int>는 Int 요소에 대한 Array<Int>의 KeyPath이다.
// 서브스크립트에 대한 KeyPath
let array = [1, 2, 3, 4, 5]
let indexKeyPath = \\Array<Int>.[2] // 2번 인덱스에 대한 KeyPath
let element = array[keyPath: indexKeyPath]
print("Element at index 2: \\(element)") // Output: Element at index 2: 3
KeyPath를 사용하여 속성, 서브스크립트에 대한 참조를 생성할 수 있다. 이를 통해 속성에 대한 정보를 추출하거나, 동적으로 속성에 접근하거나, 속성 간의 연산을 수행할 수 있다. 또한, KeyPath를 사용하여 함수에 속성 또는 서브스크립트를 전달할 수도 있다.
KeyPath prefix operator
\. : key-path-expression (\ <TYPE NAME> . <path>)
Type의 경우 추론이 가능해서, key-path-expression을 사용하는 경우 추론이 가능한 상황이면 \.<path> 로 사용이 가능하다.
정리하면, 프로퍼티는 값에 대한 참조. 따라서 프로퍼티를 사용하면 값(value)에 접근 가능하다. 하지만, keyPath는 값에 대한 참조가 아닌 프로퍼티에 대한 참조이다. 즉, 객체 내부의 값에 직접적으로 참조하는 것이 아닌 값의 이름(프로퍼티)를 참조하는 것이다.
여러가지 KeyPath에 대한 클래스가 있으니 상황에 맞게 사용하면 된다.
AnyKeyPath : 타입이 지워진 KeyPath
PartialKeyPath : 부분적으로 타입이 지워진 KeyPath
KeyPath : 읽기 전용
WritableKeyPath : 읽기 및 쓰기 가능
ReferenceWritableKeyPath : 클래스의 인스턴스에 사용 가능. 변경 가능한 모든 프로퍼티에 대한 read & write access 제공.
Documentation
docs.swift.org
'Swift > 학습' 카테고리의 다른 글
2022 WWDC Design protocol interfaces in Swift (0) | 2023.05.03 |
---|---|
Existential any in Swift explained with code examples(번역) (0) | 2023.04.06 |
Swift Opaque Types(번역) (0) | 2023.03.28 |
enum으로 특정 단위를 명확하게 표현하기 (0) | 2022.09.25 |
2022 WWDC Embrace Swift Generics (1) | 2022.07.04 |