我正在关注使用Google Maps iOS SDK的raywenderlich.com教程。我在这里找到了这段代码:https://www.raywenderlich.com/109888/google-maps-ios-sdk-tutorial。
我熟悉Swift但是我没有得到geocoder.reverseGeocodeCoordinate(coordinate)之后的代码片段;具体来说,如何在方法调用之后立即放置大括号以及它完成了什么?我在Swift语法方面问这个问题。
func reverseGeocodeCoordinate(coordinate: CLLocationCoordinate2D) {
// 1
let geocoder = GMSGeocoder()
// 2
geocoder.reverseGeocodeCoordinate(coordinate) { response, error in
if let address = response?.firstResult() {
// 3
let lines = address.lines as! [String]
self.addressLabel.text = lines.joinWithSeparator("\n")
// 4
UIView.animateWithDuration(0.25) {
self.view.layoutIfNeeded()
}
}
}
}
答案 0 :(得分:1)
它被称为trailing closure。尾随闭包是一个闭包表达式,它写在函数调用的括号之外。
这里唯一的要求是闭包必须是函数的最终参数。
鉴于以下功能,这两个调用是相同的:
func someAPICall(url: String, completion: (Bool -> Void)) {
// make some HTTP request
completion(result.isSuccess)
}
someAPICall("http://httpbin.org/get") { success in
print("Success", success)
}
someAPICall("http://httpbin.org/get", completion: { success in
print("Success", success)
})
答案 1 :(得分:0)
这称为“尾随闭包”或“尾随闭包语法”。它在Apple的文档中有描述:
总之,如果方法或函数的最后一个参数是闭包,则可以在函数调用的结束)
和前面的参数之后立即提供它。例如:
func sendMessage(text:String, withCallback:(Bool)->()) {
// Implementation
}
let message = "hello"
sendMessage(message) {
let result = $0 ? "Suceeded" : "Failed"
print(result)
}
如果一个函数只接受一个参数而该参数是一个闭包,那么你根本不需要使用()
,只需在函数名后立即传递闭包。例如,查看如何调用此过滤器方法:
let boolArray = [true, true, false, true, false]
let filtered = boolArray.filter { $0 == false } // Only the falses