Blog

keyPath as a function

Published 1 min read

Let's define a User struct and make an array of it.

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)]

And to get the email or isAdmin value with map,

or to use filter, you have to pass a closure.

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

But you can write it more nicely by using a keyPath like a function.

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

This is exactly the same as using a keyPath like this.

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

This was introduced in Swift 5.2 so that the compiler lets a keyPath work like a function.

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)

Comments

Leaving a comment stores your nickname (or GitHub profile info). Privacy policy

GitHub