【问题标题】:Passing closure in Swift在 Swift 中传递闭包
【发布时间】: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)
    })

我没有通过很多闭包,所以我可能做错了,但 (())? 过去曾为我工作过......另外,如果它有任何区别,我的测试中不会调用它我的常规代码。

对我在这里缺少的内容有什么帮助吗?

-编辑-

将闭包参数更改为(() -&gt; ())? 后,我收到此错误:

Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() -> ())?)'

前两个参数运行良好,但它仍然不喜欢我的关闭。即使我没有给它任何变量,我是否应该在第一行添加一些东西(例如var in)。提前致谢。

【问题讨论】:

  • 谢谢,我现在就试试。我为什么不希望它返回 Void 来启发我自己?
  • 我很快就会进行后续编辑。
  • 关于新错误,您传递了一个可选的MockRecordable 作为第一个参数。也许你应该打开它?
  • 就是这样!我真是个白痴。如果您想发布作为答案,我可以为您选中标记。谢谢@Rob

标签: swift closures completionhandler


【解决方案1】:

在函数声明中,不要将参数声明为completionHandler: (())?,而是需要completionHandler: (() -&gt; Void)?completionHandler: (() -&gt; ())?

因此:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> Void)? = nil) { ... }

或者

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> ())? = nil) { ... }

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多