gpt4 book ai didi

swift - 在 Swift 中传递闭包

转载 作者:行者123 更新时间:2023-11-28 06:37:28 25 4
gpt4 key购买 nike

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

关于swift - 在 Swift 中传递闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38806940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com