HIT해

[Swift 기초문법 - 70] KeyPath 본문

Swift/Swift 기초문법

[Swift 기초문법 - 70] KeyPath

힛해 2024. 8. 25. 01:37
728x90

KeyPath란?

특정 타입의 속성에 대한 경로르 나타내는 참조다.

KeyPath를 사용하면 객체의 특정 속성에 접근하거나, 그 속성을 읽고 쓸 수 있다. 이 기능은 특히 KVO와 같은 기능에 유용하다.

 

KeyPath의 기본 개념

KeyPath는 간단히 말해 객체의 속성에 대한 경로를 나타낸다.

 

KeyPath 사용 예제

struct Person {
    var name: String
    var age: Int
}

let person = Person(name: "Alice", age: 30)

// KeyPath 생성
let nameKeyPath = \Person.name
let ageKeyPath = \Person.age

// KeyPath를 사용하여 값 읽기
let personName = person[keyPath: nameKeyPath]
let personAge = person[keyPath: ageKeyPath]

print(personName)  // 출력: Alice
print(personAge)   // 출력: 30

 

Person 구조체에 대한 KeyPath를 사용하여 name과 age 속성에 접근한다.

KeyPath는 \ 문법을 사용하여 생성되며 [keyPath:] 서브스크립트를 통해 값을 가져올 수 있다.

 

WritableKeyPath

기본적으로 KeyPath는 읽기 전용이다. 그러나 WritableKeyPath가 제공되어 속성의 값을 변경할 수 있다.

struct Person {
    var name: String
    var age: Int
}

var person = Person(name: "Alice", age: 30)

// WritableKeyPath 생성
let ageKeyPath = \Person.age

// KeyPath를 사용하여 값 변경
person[keyPath: ageKeyPath] = 31

print(person.age)  // 출력: 31

 

 

KeyPath 활용

 

1. 함수에 KeyPath 전달

func getValue<T, V>(from object: T, keyPath: KeyPath<T, V>) -> V {
    return object[keyPath: keyPath]
}

let person = Person(name: "Bob", age: 25)
let name = getValue(from: person, keyPath: \Person.name)
print(name)  // 출력: Bob

 

2. KeyPath와 map

KeyPath는 컬렉션에서 속성 값을 추출하는 데 유용하다.

struct Person {
    var name: String
    var age: Int
}

let people = [
    Person(name: "Charlie", age: 25),
    Person(name: "Dave", age: 28),
    Person(name: "Eve", age: 22)
]

let names = people.map(\.name)
print(names)  // 출력: ["Charlie", "Dave", "Eve"]