【问题标题】:Error converting Obj-C function completion handler code to Swift 2.0将 Obj-C 函数完成处理程序代码转换为 Swift 2.0 时出错
【发布时间】:2016-01-30 00:24:22
【问题描述】:

我在转换/理解 Obj-C 完成处理程序的工作方式以及如何将它们转换为 Swift 2.0 时遇到问题...具体来说,代码如下:

[BLAH aRandomTaskWithURL:NSURL completion:^(NSURL *compVar) {

//do something with compVar

}];

这是我的尝试:

BLAH.aRandomTaskWithURL(myURL,completion: (compVar:NSURL)  ) {

            print(compVar)
   }

上面产生了错误“delete compVar:”...所以我删除它,然后它说“不能调用类型 (NSURL) 的参数列表类型为 ' ( () -> () )'

我曾多次尝试定义 Swift 2.0 等值的 compVar,但没有运气...我还阅读(并遵循)有关 Swift 完成变量的相关文档,但还是没有运气。我错过了什么?

但是,当我添加“Void in”时

BLAH.aRandomTaskWithURL(myURL, completion:  ) { Void in

            //do something
    }

没有错误,但我无权访问完成变量。

这是实际的 obj-c 代码(我之前只是想保持一般性):

(void)optimalGIFfromURL:(NSURL*)videoURL loopCount:(int)loopCount completion:(void(^)(NSURL *GifURL))completionBlock {

【问题讨论】:

  • 用你最好的 Swift 代码更新你的问题并指出你遇到了什么问题。

标签: ios objective-c swift


【解决方案1】:

是:

BLAH.aRandomTaskWithURL(myURL, completion: { compVar: NSURL in
    print(compVar)
})

或者,使用尾随闭包语法:

BLAH.aRandomTaskWithURL(myURL) { compVar: NSURL in
    print(compVar)
}

仅供参考,它还取决于NSURL 参数的可空性配置。如果未指定可空性,则为:

BLAH.aRandomTaskWithURL(myURL) { compVar: NSURL! in
    print(compVar)
}

或者,如果它被明确标记为可为空:

BLAH.aRandomTaskWithURL(myURL) { compVar: NSURL? in
    print(compVar)
}

或者,最简单的方法是让编译器推断可空性:

BLAH.aRandomTaskWithURL(myURL) { compVar in
    print(compVar)
}

如果您已正确导入 aRandomTaskWithURL 的标头,代码完成将向您显示 compVar 的正确配置(无论是否可选)。

【讨论】:

  • 嗯,还是报错,所以我查看了实际的函数,并用它更新了我的答案
  • @säculnój - 你的例子是BLAH.aRandomTaskWithURL(myURL, completion: ) { ... }。右括号在错误的位置。你有效地说“好的,这里是completion”,但后来没有提供。它是BLAH.aRandomTaskWithURL(myURL, completion: { compVar in ... })(注意,右括号右括号之后)或BLAH.aRandomTaskWithURL(myURL) { compVar in ... }(注意,no completion 参数完全指定,此时右括号是尾随闭包的大括号之前。
  • 好的,所以在闭包之外定义 compVar 然后使用你的第一个建议修复它.. 但现在我实际上比以前更困惑哈哈。基本上,我的函数如何知道使用 compVar?
  • 它在逻辑上等价于 Objective-C 块模式,你调用 aRandomTaskWithURL 为它提供一个 URL 和一个块(在 Swift 中称为“闭包”)并且该方法完成后将调用您的块/闭包,为您提供一些您可以在块/闭包中引用的 URL。如果您习惯于在 Objective-C 中使用完成块,它在 Seift 中使用完成闭包的工作方式相同(但语法略有不同,而且,恕我直言,不那么神秘)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
相关资源
最近更新 更多