public func fetchAllRooms(completion: ([RemoteRoom]?) -> Void) {
let url = NSURL(string: "http://localhost:5984/rooms/_all_docs?include_docs=true")!
let urlRequest = NSMutableURLRequest(
URL: url,
cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData,
timeoutInterval: 10.0 * 1000)
urlRequest.HTTPMethod = "GET"
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
let task = urlSession.dataTaskWithRequest(urlRequest)
{ (data, response, error) -> Void in
guard error == nil else {
print("Error while fetching remote rooms: \(error)")
completion(nil)
return
}
guard let json = try? NSJSONSerialization.JSONObjectWithData(data!,
options: []) as? [String: AnyObject] else {
print("Nil data received from fetchAllRooms service")
completion(nil)
return
}
guard let rows = json["rows"] as? [[String: AnyObject]] {
print("Malformed data received from fetchAllRooms service")
completion(nil)
return
}
var rooms = [RemoteRoom]()
for roomDict in rows {
rooms.append(RemoteRoom(jsonData: roomDict))
}
completion(rooms)
}
task.resume()
}
我在Swift中很新。请帮我理解这段代码片段
fetchAllRooms
函数采用名称完成的另一个函数,该函数接受一个参数数组RemoteRoom并返回void。
现在在最后,使用参数RemoteRoom调用完成块(语法看起来像Objective C中的块回调)。 RemoteRoom得到初始化&完成块被称为completion(rooms)
。但完成块的主体在哪里?当行:completion(rooms)
被执行时,要执行的行是什么?
感谢您的全面回答@vacawwama。我有几个问题。如果我比较“//传递闭包”和“//与尾部闭包语法”何时使用闭包以及何时使用尾部闭包?任何特定情况?为什么这是用于关键字?输入参数?为什么这个$ 0用于?如果在用于描述输入参数那么在问题的行“{(数据,响应,错误) - > Void in”中怎么样。 – user804417
@ user804417,如果最后一个参数采用闭包,则通常使用尾随闭包语法。 'in'关键字将参数从闭包体中分离出来。 '$ 0'代表第一个参数。如果你有3个参数,那么你会使用'$ 0','$ 1'和'$ 2'。 – vacawama
非常感谢主席先生!现在很清楚! – user804417