## Question:

Consider the following code:

``````struct Planet {
var name: String
var distanceFromSun: Double
}

let planets = [
Planet(name: "Mercury", distanceFromSun: 0.387),
Planet(name: "Venus", distanceFromSun: 0.722),
Planet(name: "Earth", distanceFromSun: 1.0),
Planet(name: "Mars", distanceFromSun: 1.52),
Planet(name: "Jupiter", distanceFromSun: 5.20),
Planet(name: "Saturn", distanceFromSun: 9.58),
Planet(name: "Uranus", distanceFromSun: 19.2),
Planet(name: "Neptune", distanceFromSun: 30.1)
]

let result1 = planets.map { \$0.name }
let result2 = planets.reduce(0) { \$0 + \$1.distanceFromSun }
``````

What are the types and values of the `result1` and `result2` variables? Explain why.

`result1` is an array of strings, containing the list of the planet names `result2` is a double, calculated as the sum of the distance of all planets

The `map` method of the `Array<T>` struct type performs a transformation of the source array into an array of another type, whose values are obtained by executing the closure passed as parameter to each element of the array. In the above code, the closure returns the `name` property, so the `map` method in the above code returns an array of planet names.

Given an initial value and a closure, the `reduce` method of the `Array<T>` struct type returns a single value obtained by recursively applying the closure to each element of the array. The closure takes the value calculated at the previous step (or the initial value if it’s the first iteration) and the current array element, and is expected to return a value of the same type of the initial value.

In the above code, the closure returns the sum of what calculated at the previous step, plus the value of the `distanceFromSun` property for the current element. The end result is the sum of the distances of all planets.

Keywords: