KeyPath 알아보기

권승용(Eric)·2025년 1월 7일

TIL

목록 보기
30/38

KeyPath?

  • 값이 아닌 프로퍼티에 대한 참조.
  • 어떤 타입의 프로퍼티에 대한 경로를 표현하는 것.
  • 프로퍼티의 값에 대한 접근은 아래와 같이 가능
struct Human {
	var name: String
}
let human = Human(name: "Eric")
human.name // "Eric"
  • KeyPath는 프로퍼티에 대한 경로를 표현하는 객체이다.
  • 아래와 같이 사용 가능하다.
struct Human {
    var name: String
}

let eric = Human(name: "Eric)
let pathToProperty = \Human.name

let value = eric[keyPath: pathToProperty]
// value is 12
  • 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)
profile
ios 개발자에용

0개의 댓글