본문 바로가기
카테고리 없음

Swift KeyPath Expressions

by ARpple 2025. 5. 9.
 

Key-Path Expressions | Apple Developer Documentation

Use key-path expressions to access properties dynamically.

developer.apple.com

KeyPath Expressions API?

키 경로 표현식을 사용하여 프로퍼티에 동적으로 액세스하기

말이 너무 어렵다… 코드를 보는게 이해가 더 쉬웠다.

struct SomeStructure {
    var someValue: Int // -> 이게 프로퍼티
}

let s = SomeStructure(someValue: 12)
let pathToProperty = \SomeStructure.someValue // 이게 표현 식

let value = s[keyPath: pathToProperty] // 이 프로퍼티로 someValue의 값에 접근
// value is 12

Key Path의 장점

  1. 간결하게 코드에 접근 할 수 있다. → 거의 이게 다 임..!
  2. 인스턴스 전체가 아닌 일부 프로퍼티에 값을 사용할 때
  3. 프로퍼티를 “문자열”이 아닌 특정 표현 식으로 간결하게 접근할 수 있다.
  4. KeyPath를 통해 컴파일 타임 시점에 동적으로 엑세스가 가능함

KeyPath Expressions API Collections

Swift는 KeyPath를 다양한 사용에 알맞게 지원하기 위해 총 5개의 class 타입으로 제공함

KeyPath

⇒ 가장 일반적인 KeyPath API

  • 인스턴스 값에 접근하기 위해 주로 사용한다.
  • 이 프로퍼티를 갖고 있는 인스턴스 타입을 Key로, 프로퍼티 타입 Value로 갖으며 컴파일 타임에 추론한다.
let pathToProperty:KeyPath<SomeStructure,Int> = \SomeStructure.someValue // 이게 표현 식

PartialKeyPath

⇒ 인스턴스 타입 알 수 있는 KeyPath API

  • 이 인스턴스의 하위 프로퍼티 타입이 무엇인지는 추론하지 않는다.
  • 인스턴스가 해당 프로퍼티를 갖고 있음을 알 수 있다.

AnyKeyPath

⇒ 인스턴스 타입과 하위 프로퍼티 타입이 무엇인지 모르는 API

  • SwiftUI의 AnyView와 비슷한 역할을 한다.
  • as 타입 캐스팅으로 지정 KeyPath로 변환할 수 있다.
  • 사용할 순 있으나 굳이..?

WritableKeyPath

⇒ 결과 값에 대한 읽기 및 쓰기를 지원하는 키 경로입니다.

  • KeyPath는 접근만 가능 하지만, WritableKeyPath는 값을 수정할 수 있다.
  • 해당 인스턴스가 불변, 가변인지가 중요하다. 참조 타입인지, 값 타입인지는 중요하지 않다.

❌ 사용할 수 없는 경우

상수일 때는 값을 바꿀 수 없다..!

struct TimerRecordItem {
  var duration: Int = 0
}

let timerItem = TimerRecordItem(duration: 2)
let writable: WritableKeyPath<TimerRecordItem, Int> = \TimerRecordItem.duration
timerItem[keyPath: writable] = 2 // 여기서 에러 난다..!

 

사용 예시

struct TimerRecordItem {
  var duration: Int = 0
}

var timerItem = TimerRecordItem(duration: 2)
let writable: WritableKeyPath<TimerRecordItem, Int> = \TimerRecordItem.duration
timerItem[keyPath: writable] = 2 // 여기서 에러 난다..!

ReferenceWritableKeyPath

  • 참조 타입(class)에만 접근하고 파라미터 값을 바꿀 수 있는 KeyPath
  • Actor 같은 경우는 파라미터 값 자체의 원자성을 보장하기 위해 KeyPath 변경이 안됨…

참고 자료

https://woozoobro.medium.com/swift%EC%97%90%EC%84%9C-key-path-

%ED%91%9C%ED%98%84%EC%8B%9D-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-5956923a8976

https://ios-development.tistory.com/982

https://green1229.tistory.com/172

 

+ Swift 공식 문서..!

댓글