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)
}
我对reduce函数的理解是:
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 = reduce函数的初始值被设置为
(MKMapRectNull)
//2 = 传入一个闭包,该闭包带有两个参数而不是一个运行总数和一个数组中的对象,并返回一个MKMapRect
。(mapRect: MKMapRect, treasure: Treasure) -> MKMapRect
//3 = 我卡在这里了。 一个叫做MKMapRect
的结构体被调用,它有两个参数origin: treasure.location.mapPoint
和size: MKMapSize(width: 0, height: 0)
问题1:如果传入的值是0,0
,MKMapSize
将如何计算?它如何获取后续的值并添加它们?
问题2:当此行被返回到//2闭包
return MKMapRectUnion(mapRect, treasurePointRect)
时,它如何成为运行总数,以及它如何知道要获取self.treasures的下一个元素?
MKMapRectUnion()
时发生了变化,因为它返回包含两个参数的MKMapRect
。即使这两个参数实际上只是点,联合体也将是包含两个点的矩形。 - Nate CookMKMapRect
是一个带有origin
和size
属性的值类型。return MKMapRectUnion(...)
返回一个MKMapRect
值(就像您简单示例中返回一个Int
值一样),然后在下一次迭代中将其传回闭包。 - Nate Cook