키 경로 KeyPath (\.)
코드를 작성하다 보면
아니 사실 만들어져 있는(ㅋㅋ) 코드를 보다보면
이런 역슬래쉬에 온점(periode)가 함께 있는걸 자주 보게되는데
역시나 별 생각없이 그냥 그렇구나~ 하다가
이게 뭐냐는 질문에 에..? 글쎄요 뭘까요,,? 하다 찾아 보게되었음.
앞으로 역슬래쉬는 ₩로 표시될거임.. 하 ...
\.는 keyPath를 나타내는 문법
\. 뒤에 오는 것은 어떤 타입의 속성(property)을 가리키는 경로를 의미한다.
List(users, id: \.id) { user in
Text(user.name)
}
여기서 \.id 는 각 user 객체의 id 속성을 의미하는 KeyPath<User, IDType>
List 는 각 user 의 고유한 식별자로 id 를 사용하겠다는 뜻
KeyPath
특정 루트 유형에서 특정 결과 값 유형으로 가는 키 경로
class KeyPath<Root, Value>
이 유형의 인스턴스를 만드는 가장 일반적인 방법은
\somelass.someProperty 와 같은 키 경로 표현식을 사용하는 것이다
Swift에서 KeyPath는 어떤 타입의 속성에 접근할 수 있는 경로를 타입 안전하게 표현한 것
struct Person {
let name: String
let age: Int
}
let nameKeyPath = \Person.name
이 nameKeyPath 는 Person 의 name 속성에 접근하는 방법을 담고 있는 KeyPath
TextField("이름", text: $user.name)
Picker("정렬", selection: $selectedSort) {
Text("이름순").tag(\User.name)
Text("나이순").tag(\User.age)
}
이런 식으로 \.속성 형태로 쓰이면, 값을 직접 가져오는 것이 아니라 그 경로 자체를 전달하는 것이다.
\.self 도 자주 보이는데
\.self 는 SwiftUI에서 자기 자신(자체 객체)를 의미하는 특별한 KeyPath이다.
\.self 란
- \.self 는 "객체 자체"를 나타내는 KeyPath
- id: \.self 이렇게 쓰면, 객체 전체가 고유 식별자로 사용한다는 뜻
let fruits = ["🍎", "🍌", "🍇"]
List(fruits, id: \.self) { fruit in
Text(fruit)
}
여기서 fruits 는 그냥 String 배열. "🍎" 이런 문자열 하나하나가 중복이 없다고 가정하고, 그 자체를 ID로 쓰겠다는 의미.
id: \.self 는 "각 요소 자신을 ID로 사용"하겠다는 뜻
Identifiable이 아닌 Struct
struct Person {
let name: String
let age: Int
}
let people = [
Person(name: "Alice", age: 25),
Person(name: "Bob", age: 30)
]
List(people, id: \.self) { person in
Text(person.name)
}
이 코드에서 Person 이 Identifiable 프로토콜을 따르지 않기 때문에 SwiftUI는 뭘 기준으로 ID를 삼을지 모른다.
그래서 우리가 id: \.self 라고 써서 "이 구조체 전체를 ID로 사용해"라고 알려준다.
단, 이럴 때는 Person 이 Equatable 과 Hashable 을 따르고 있어야 된다. 그래야 Swift가 그 자체를 비교하고 ID처럼 쓸 수 있다.
KeyPath | 의미 |
\.id | 객체의 id 속성을 ID로 사용 |
\.self | 객체 그 자체를 ID로 사용 |