在 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) { ... }
我有一个一直在我的代码中使用的函数,但我现在需要向它传递一个完成处理程序(这样我就可以退出 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) { ... }