Changes in new versions / Swift 4.0

struct Person {
    var name: String
    var age: Int
}

// *** before: ***
// #keyPath worked only for Objective-C types, and gave a string;
// for a Swift struct there was only a closure
let names = people.map { $0.name }

// *** in version 4.0: ***
let nameKey = \Person.name          // WritableKeyPath<Person, String>

var alina = Person(name: "Alina", age: 25)
print(alina[keyPath: nameKey])      // reading
alina[keyPath: \Person.age] = 26    // and writing

// the path is a value: it can be stored, passed and chosen at run time
let keys: [PartialKeyPath<Person>] = [\Person.name, \Person.age]
for key in keys { print(alina[keyPath: key]) }

let names = people.map { $0[keyPath: nameKey] }