Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- composable architecture
- 컴퓨터그래픽스
- 운영체제
- swift concurrency
- 대외활동
- 스위프트
- 멋사
- SwiftUI
- TCA
- 스유
- widget
- 위젯킷
- 리액트
- 백준
- cs
- c++
- 후기
- 1일1알골
- Protocol
- uikit
- 영남대
- 네트워크
- dispatchqueue
- widgetkit
- 웹
- 알고리즘
- 문법
- Swift
- spritekit
- 멋쟁이사자처럼
Archives
- Today
- Total
맛동산이
Swift) KeyPath란 본문
struct Person {
var name: String
var age: Int
}
let jinyong = Person(name: "jin", age: 28)
let jung = Person(name: "jung", age: 27)
let shana = Person(name: "shana", age: 25)
let people = [jinyong, jung, shana]
var name = people.map { $0.name }
// name = ["jin", "jung", "shana"]
이러한 코드가 있을때, 키패스를 사용하면 다음과 같이 동일하게 작동한다.
var name = people.map { $0.name }
var name = people.map(\.name)
키패스와 동일하게 작동하는것이 바로 KVC이다.
KVC(Key Value Coding)
- key : Key는 문자열을 의미하며, 이 key값을 통해서 인스턴스의 프로퍼티에 간접적으로 접근할수 있도록 하는 objective-c 개념
class Person: NSObject {
@objc var name: String?
}
let person = Person()
person.value(forKey: "name") //nil
person.setValue("jin", forKey: "name") // name = "jin"
person.value(forKey: "name") // "jin"
KeyPath로의 접근
위에서도 key값으로 프로퍼티에 접근했지만, keyPath를 통해서도 접근이 가능하다.
keyPath로의 접근은 , RootType부터 구체적인 property type으로의 key경로를 의미한다.
- 즉 keyPath로 인스턴스 안 프로퍼티 접근이 가능하다.는 말이다.
person[keyPath: \.Person.name]
person[keyPath: \.name] //루트타입은 생략 가능(추론이 명확하게 가능하다면)
키패스 직접 정의
KeyPath<Root, Property>
//루트가 Root, 프로퍼티가 .뒤에오는 값이다. 즉
KeyPath<Person, name> 타입이 person[keyPath: \.Person.name]에서
\.Person.name 이라는것이다.
따라서 다음과 같은 함수 정의가 가능하다.
extension Person {
func getName(keyPath: KeyPath<Self, name>) -> name {
self[keyPath: keyPath]
)
}
let jin = person(name: "jin")
jin.getName(keyPath: \.name) //"jin"
jin.getName(keyPath: \.age) // nil > 에러뜸
키패스를 사용하는 이유
- KVC(Key Value Coding)에서는 프로퍼티에 접근할 때 문자열 key값을 이용했지만, KeyPath를 이용하면 문자열이 아닌 프로퍼티 이름으로 접근이 가능 -> runtime error 방지에 유리
- 즉 String값의 오타를 줄일수 있다.
참고자료
반응형
'앱 > Swift' 카테고리의 다른 글
UIKit) Dynamic App Icon 변경하기 (0) | 2024.01.01 |
---|---|
Swift) DynamicMemberLookUp(feat. subscript) 정리 (0) | 2024.01.01 |
Swift) CodingKey, API명과 codable 타입 이름이 다를때 매핑하는법 (0) | 2024.01.01 |
Swift) NSCache와 NSDictionary (0) | 2023.09.07 |
Swfit) static library, dynamic library의 차이에 대해서(feat. framework) (0) | 2023.09.07 |