iOS 관련 공부/SwiftUI

키 경로 KeyPath (\.)

가애야 2025. 4. 24. 11:36

코드를 작성하다 보면

아니 사실 만들어져 있는(ㅋㅋ) 코드를 보다보면

이런 역슬래쉬에 온점(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로 사용