본문 바로가기

iOS 개발/Swift 문법

[iOS/Swift] KeyPath

KeyPath

프로퍼티를 실제로 불러오거나 정보를 읽지 않은 채로 그 자체를 참조만 할 수 있게 한다.

 

struct Person{
    var socialSecurityNumber: String
    var name: String
}

let atj = Person(socialSecurityNumber: "13-2432-21", name: "TaeJeong")

let nameKeyPath = \Person.name
let SSNKeyPath = \Person.socialSecurityNumber

print(atj[keyPath: nameKeyPath])
print(atj[keyPath: SSNKeyPath])
 

KeyPath 활용하기

Identifiable 프로토콜을 사용할 때 객체마다 상이한 identifier 의 타입을 associatedType 과 KeyPath를 통해 다룰 수 있다.

 

protocol Identifiable {
    associatedtype ID
    static var idKey: WritableKeyPath<Self, ID> { get }
}

struct Person: Identifiable {
    static let idKey = \Person.socialSecurityNumber
    var socialSecurityNumber: String
    var name: String
}

struct Book: Identifiable {
    static let idKey = \Book.isbn
    var isbn: String
    var title: String
}

func printID<T: Identifiable>(about object: T) {
    print(object[keyPath: T.idKey])
}

let atj = Person(socialSecurityNumber: "13-2432-21", name: "TaeJeong")
let Hamlet = Book(isbn: "1-134-2", title: "Hamlet")

printID(about: atj)
printID(about: Hamlet)