본문 바로가기
Swift

keyPath의 함수기능

by IYEA 2023. 8. 31.

User 구조체를 정의하고 그 배열을 만들자

struct User {
    let email: String
    let isAdmin: Bool
}

let users = [User(email: "A", isAdmin: true),
             User(email: "B", isAdmin: false),
             User(email: "C", isAdmin: true),
             User(email: "D", isAdmin: false)]

그리고 map을 이용해서 email이나 isAdmin값을 가져오거나

filter를 사용하려면 클로저를 전달해야한다.

users.map{$0.email}
users.map{$0.isAdmin}
users.filter{$0.isAdmin}

하지만 keyPath를 함수처럼 사용해서 더 예쁘게 작성할 수 있다.

users.map(\.email)
users.map(\.isAdmin)
users.filter(\.isAdmin)

이는 keyPath를 이용했을 때 이와 완전히 동일하다

users.map{ $0[keyPath: \User.email] }
users.map{ $0[keyPath: \User.isAdmin] }
users.filter{ $0[keyPath: \User.isAdmin] }

이는 컴파일러가 keyPath를 함수와 같은 기능을 할 수 있도록 Swift 5.2 에서 도입되었다.

let f1: (User) -> String = \User.email
users.map(f1)

let f2: (User) -> String = \.email
users.map(f2)

let f3 = \User.email as (User) -> String
users.map(f3)

let f4 = \.email as (User) -> String
users.map(f4)

Reference:

swift-evolution/proposals/0249-key-path-literal-function-expressions.md at main · apple/swift-evolution (github.com)