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: