我有一个我在代码中使用过的函数,但我现在需要将一个完成处理程序传递给它(所以我可以退出一个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
),即使我没有给它任何变量。提前谢谢。
答案 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) { ... }