在Swift中通过关闭

在Swift中通过关闭,swift,closures,completionhandler,Swift,Closures,Completionhandler,我在代码中使用了一个函数,但我现在需要向它传递一个完成处理程序(这样我就可以退出dispatch_组)。我不希望它影响我代码的其余部分,因此我尝试从以下内容更改名称空间: func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase) 我得到这个错误: Function produces expected type 'Void' (aka '()'); did

我在代码中使用了一个函数,但我现在需要向它传递一个完成处理程序(这样我就可以退出dispatch_组)。我不希望它影响我代码的其余部分,因此我尝试从以下内容更改名称空间:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase)
我得到这个错误:

Function produces expected type 'Void' (aka '()'); did you mean to call it with '()'?
Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() -> ())?)'
我认为,因为
completionHandler:(())?
参数的默认值为
nil
,编译器被闭包弄糊涂了,但当我尝试此操作时,仍然会出现相同的错误:

    cloud.uploadRecordable(testRecordable, database: database, completionHandler: {
        dispatch_group_leave(forCloudToBeClearOfTestRecord)
    })
我没有通过很多闭包,所以我可能做错了,但是
(())?
在过去对我有效。。。此外,如果它有任何不同,这是在我的测试中调用的,而不是在我的常规代码中调用的

有什么可以帮我的吗

-编辑-

将闭包参数更改为
(()->())?
后,出现以下错误:

Function produces expected type 'Void' (aka '()'); did you mean to call it with '()'?
Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() -> ())?)'

前两个参数运行良好,但它仍然不喜欢我的闭包。即使我没有给它任何变量,我也应该在第一行上放一些东西(例如,中的
var)。提前感谢。

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

因此:

func uploadRecordable(instanceConformingToRecordable:T,数据库:CKDatabase,completionHandler:(()->Void)?=nil){…}

func uploadRecordable(instanceConformingToRecordable:T,数据库:CKDatabase,completionHandler:(()->())?=nil){…}

谢谢,我现在就试试。为什么我不希望它返回Void,以供我自己参考?我很快会进行后续编辑。关于新错误,您将传递一个可选的
MockRecordable
作为第一个参数。也许你应该把它打开?就这样!我真是个白痴。如果你想发布答案,我可以帮你勾选。谢谢@Rob
func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> Void)? = nil) { ... }
func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> ())? = nil) { ... }