closures - 在 swift 中使用带有多个参数的闭包

标签 closures swift

这个问题主要基于这个问题:

Link

主要区别在于我也想将参数传递给闭包。假设我有这样的东西:

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/

相关文章:

iOS,包含 nib 的 swift 容器库?

swift - 快速关闭中的 Int 不递增

javascript - 尝试遍历数组并为每个数组添加一个 get 函数

objective-c - block 、循环和局部变量

ios - Swift 日期选择器日期

json - 如何在 SwiftUI 中解码来自 API 的 JSON 响应以在 View 中使用

java - 来自不同脚本的闭包的 Groovy 全局存储

javascript - $.proxy() 和 bind() 有什么区别?

swift - 为什么变量赋值之外的数字会编译?

swift - Swift 将内容移到键盘后面不起作用