Swift中的这个Google Maps iOS SDK代码有什么作用?

时间:2016-09-04 05:13:51

标签: ios swift closures

我正在关注使用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()
      }
    }
  }
}

2 个答案:

答案 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的文档中有描述:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID102

总之,如果方法或函数的最后一个参数是闭包,则可以在函数调用的结束)和前面的参数之后立即提供它。例如:

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