在Swift中传递闭包

时间:2016-08-06 17:27:56

标签: swift closures completionhandler

我有一个我在代码中使用过的函数,但我现在需要将一个完成处理程序传递给它(所以我可以退出一个dispatch_group)。我不希望它影响我的其余代码,所以我尝试更改命名空间:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase)

到此:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (())? = nil)

当我像这样把封闭传递给它时:

cloud.uploadRecordable(testRecordable, database: database) {
        dispatch_group_leave(forCloudToBeClearOfTestRecord)
    }

我收到此错误:

Function produces expected type 'Void' (aka '()'); did you mean to call it with '()'?

我认为因为completionHandler: (())?参数的默认值为nil,编译器会被闭包混淆,但是当我尝试这个时我仍然会得到同样的错误:

    cloud.uploadRecordable(testRecordable, database: database, completionHandler: {
        dispatch_group_leave(forCloudToBeClearOfTestRecord)
    })

我还没有通过很多关闭,所以我可能做错了,但(())?过去曾为我工作过......而且,如果有任何不同,这就是被称为在我的测试中,不是我的常规代码。

对我在这里失踪的任何帮助?

- 编辑 -

将闭包参数更改为(() -> ())?后,我收到此错误:

Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() -> ())?)'

前两个论点一直很好,但它并不像我的闭包那样。我应该在第一行放置一些东西(例如var in),即使我没有给它任何变量。提前谢谢。

1 个答案:

答案 0 :(得分:1)

在函数声明中,您希望completionHandler: (())?completionHandler: (() -> Void)?而不是将参数声明为completionHandler: (() -> ())?

因此:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> Void)? = nil) { ... }

或者

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> ())? = nil) { ... }