这个问题主要基于这个问题:
主要区别在于我也想将参数传递给闭包。假设我有这样的东西:
func someFunctionThatTakesAClosure(completionClosure: (venues: Dictionary<String, AnyObject>, error: NSError) -> ()) {
// function body goes here
var error: NSError?
let responseDictionary: Dictionary<String, AnyObject> = ["test" : "test2"]
completionClosure(venues: responseDictionary, error: error!)
}
这里没有错误。但是当我在我的主视图 Controller 中调用这个函数时,我尝试了几种方法但是所有的结果都导致了不同的错误:
venueService.someFunctionThatTakesAClosure(completionClosure(venues: Dictionary<String, AnyObject>, error: NSError){
})
或者像这样:
venueService.someFunctionThatTakesAClosure((venues: Dictionary<String, AnyObject>, error: NSError){
})
甚至像这样:
venueService.someFunctionThatTakesAClosure(completionClosure: (venues: Dictionary<String, AnyObject>, error: NSError) -> (){
});
我可能只是太累了,但我们将不胜感激任何帮助!
最佳答案
venueService.someFunctionThatTakesAClosure({
venues, error in
// do stuff
})
您可以选择指定类型(但由于编译器知道闭包应该提供什么类型,因此您不必严格地:
venueService.someFunctionThatTakesAClosure({
(venues: Dictionary<String, AnyObject>, error: NSError) -> () in
// do stuff
})
但我在您的调用代码中发现了另一个问题:
completionClosure(venues: responseDictionary, error: error!)
// No Bueno. What if there's no error? ^^^^^^
你不应该强制解包错误,因为它完全有可能仍然是零。强制展开 nil 会导致错误。所以你想要这个:
completionClosure(venues: responseDictionary, error: error)
并且您想更改闭包以接受可选错误。总计:
func someFunctionThatTakesAClosure(completionClosure: (venues: Dictionary<String, AnyObject>, error: NSError?) -> ()) {
…
completionClosure(venues: responseDictionary, error: error)
}
// when calling:
venueService.someFunctionThatTakesAClosure({
(venues: Dictionary<String, AnyObject>, error: NSError?) -> () in
// do stuff
})
如果你想传递额外的参数,请记住 swift 针对闭包作为最后一个参数传递进行了优化(这是 objective-c API 中广泛遵循的约定):
// in venueService:
func someArgAndClosureFunction(arg1: String, arg2: Int,
completionClosure: (venues: Dictionary<String, AnyObject>, error: NSError?) -> ()) {
// do stuff
}
// When calling:
venueService.someArgAndClosureFunction("string arg 1", arg2: 10) {
(venues: Dictionary<String, AnyObject>, error: NSError?) -> () in
// do stuff
}
在此示例中,我使用了 trailing closure syntax这允许您将闭包传递给函数调用括号外部(但它仍作为最后一个参数传递)。
关于closures - 在 swift 中使用带有多个参数的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24129112/