我遵循教程并与以下代码混淆:
let rectToDisplay = self.treasures.reduce(MKMapRectNull){
(mapRect: MKMapRect, treasure: Treasure) -> MKMapRect in
let treasurePointRect =
MKMapRect (origin: treasure.location.mapPoint, size: MKMapSize (width: 0, height: 0))
return MKMapRectUnion(mapRect, treasurePointRect)
}
事实上,我不理解这一行:
(mapRect: MKMapRect, treasure: Treasure) -> MKMapRect in
这是某种功能还是什么?什么是输出?我不太明白这种结构的含义(struct: struct, someClass: someClass) -> Struct in
那是什么逻辑? “in”是什么意思?
如果您想知道,treasure
是包含坐标属性的自定义类 - 纬度,经度等。
我理解该代码段的“整体”含义,但该行的语法让我感到困惑..
你可以提供解释吗?非常感谢!答案 0 :(得分:6)
在Swift中有两种声明函数的方法:使用func
,并使用闭包表达式:
// this is a function that takes an Int and returns a String
func f(i: Int) -> String { return i.description }
f(1) // returns "1"
// this is also a function that takes an Int and returns a String
let g = { (i: Int) -> String in return i.description }
g(1) // returns "1"
后者是一个闭包表达式 - 一种快速定义内联新函数的方法。它们最常用于带有函数的函数(例如map
,它接受一个数组和一个转换该数组元素的函数,并在每个元素上运行该函数创建另一个数组)。
闭包表达式的语法是它们在大括号内开始,带有参数和返回类型,然后是in
,然后是函数体。与以func
关键字开头的func
不同,然后是参数和返回类型,后跟大括号内的函数体。
您永远不会看到in
因为它可以被取消。有许多简写允许您完全跳过参数和返回类型(以及return
关键字)。但有时您需要提供它们,然后您需要in
关键字。
您可以在Apple Swift book中阅读有关闭包表达式的更多信息。您可以阅读有关函数和闭包基础知识的更多信息here。