Ниже приведен код, который я изо всех сил, чтобы понять:Swift: Снижение функции с закрытием
let rectToDisplay = self.treasures.reduce(MKMapRectNull) { //1
(mapRect: MKMapRect, treasure: Treasure) -> MKMapRect in //2
let treasurePointRect = MKMapRect(origin: treasure.location.mapPoint, size: MKMapSize(width: 0, height: 0)) //3
return MKMapRectUnion(mapRect, treasurePointRect)
}
Мое понимание снижения функции является:
var people [] // an array of objects
var ageSum = 0
ageSum = people.reduce(0) { $0 + $1.age}
//(0) = initial value
//$0 = running total
//$1 = an object in an array
Мое понимание закрытия является:
{ (params) -> returnType in
statements
}
Мое понимание для кода на вершине:
// 1 = начальное значение для функции уменьшения устанавливается в (MKMapRectNull)
// 2 = Вместо нарастающим итогом и объект в массиве, замыкание передается с использованием двух аргументов, которая возвращает MKMapRect
:
(mapRect: MKMapRect, treasure: Treasure) -> MKMapRect
// 3 = Это где я застрял. На структуру, MKMapRect
, вызывается с двумя параметрами origin: treasure.location.mapPoint
и size: MKMapSize(width: 0, height: 0)
Вопрос 1: Как MKMapSize
вычислить, если значения, передаваемые в это 0,0
? Как получить последующие значения и добавить их?
Вопрос 2: Когда эта линия возвращается //2 closure
return MKMapRectUnion(mapRect, treasurePointRect)
, как это стало нарастающим итогом и как он знает, чтобы добраться до следующего элемента self.treasures?
Спасибо за подробный ответ. Я все еще запутался относительно того, как изменяется значение MKMapSize (width: 0, height: 0)? – user1107173
Alex справа - прямоугольник с нулевой шириной и высотой - это, по сути, просто точка (ее начало). Изменение происходит с вызовом 'MKMapRectUnion()', так как он возвращает 'MKMapRect', который включает оба параметра. Даже если оба параметра действительно являются точками, объединение будет прямоугольником, содержащим обе точки. –
Получил это. Я просто искал MKMapRect и возвращает начало и размер. Который, по моему мнению, станет следующим значением для второго вызова. – user1107173