KeyPath?
- 값이 아닌 프로퍼티에 대한 참조.
- 어떤 타입의 프로퍼티에 대한 경로를 표현하는 것.
- 프로퍼티의 값에 대한 접근은 아래와 같이 가능
struct Human {
var name: String
}
let human = Human(name: "Eric")
human.name
- KeyPath는 프로퍼티에 대한 경로를 표현하는 객체이다.
- 아래와 같이 사용 가능하다.
struct Human {
var name: String
}
let eric = Human(name: "Eric)
let pathToProperty = \Human.name
let value = eric[keyPath: pathToProperty]
- key-path 표현식은 컴파일 타임에 KeyPath 클래스 인스턴스로 바뀐다.
KeyPath를 사용하는 이유
- Key-Value Coding에서 프로퍼티에 접근하기 위한 안전한 방법으로 사용 가능
- 문자열을 통한 접근은 컴파일 타임에 오류 알기 어렵다. KeyPath 사용하면 문제 해결 가능
- Key-Value Observing에서도 KeyPath를 타입으로 받음
- 반복되는 코드 제거에 도움을 줄 수 있음
let people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Charlie", age: 35)
]
let names = people.map { $0.name }
let ages = people.map { $0.age }
- 위와 같이 특정 속성 추출을 위해서는 속성마다 별도의 map 함수 작성이 필요하다.
- 아래와 같이 KeyPath를 활용하면 하나의 메소드로 분리 가능
func extract<T, V>(_ keyPath: KeyPath<T, V>, from array: [T]) -> [V] {
return array.map { $0[keyPath: keyPath] }
}
let names = extract(\Person.name, from: people)
let ages = extract(\Person.age, from: people)