【发布时间】:2016-08-06 17:27:56
【问题描述】:
我有一个一直在我的代码中使用的函数,但我现在需要向它传递一个完成处理程序(这样我就可以退出一个 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)。提前致谢。
【问题讨论】:
-
谢谢,我现在就试试。我为什么不希望它返回 Void 来启发我自己?
-
我很快就会进行后续编辑。
-
关于新错误,您传递了一个可选的
MockRecordable作为第一个参数。也许你应该打开它? -
就是这样!我真是个白痴。如果您想发布作为答案,我可以为您选中标记。谢谢@Rob
标签: swift closures completionhandler