在 Swift 中通过闭包

Passing closure in Swift

我有一个一直在我的代码中使用的函数,但我现在需要向它传递一个完成处理程序(这样我就可以退出 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),即使我没有给它任何变量。提前致谢。

在函数声明中,不是将参数声明为 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) { ... }