function – Swift 3可选转义闭包参数

前端之家收集整理的这篇文章主要介绍了function – Swift 3可选转义闭包参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
给定:
  1. typealias Action = () -> ()
  2.  
  3. var action: Action = { }
  4.  
  5. func doStuff(stuff: String,completion: @escaping Action) {
  6. print(stuff)
  7. action = completion
  8. completion()
  9. }
  10.  
  11. func doStuffAgain() {
  12. print("again")
  13. action()
  14. }
  15.  
  16. doStuff(stuff: "do stuff") {
  17. print("swift 3!")
  18. }
  19.  
  20. doStuffAgain()

有什么为什么要使类型Action的完成参数(和动作)?并保持@escaping?

更改类型会出现以下错误

错误:@escaping属性仅适用于函数类型

删除@escaping属性代码编译和运行,但似乎不正确,因为完成闭包是转义函数的范围。

有一个 SR-2552报告,@escaping不识别功能类型别名。这就是为什么错误@escaping属性只适用于函数类型。您可以通过扩展函数签名中的函数类型来解决
  1. typealias Action = () -> ()
  2.  
  3. var action: Action? = { }
  4.  
  5. func doStuff(stuff: String,completion: (@escaping ()->())?) {
  6. print(stuff)
  7. action = completion
  8. completion?()
  9. }
  10.  
  11. func doStuffAgain() {
  12. print("again")
  13. action?()
  14. }
  15.  
  16. doStuff(stuff: "do stuff") {
  17. print("swift 3!")
  18. }
  19.  
  20. doStuffAgain()

编辑::

我实际上是在一个xcode 8测试版,其中bug SR-2552还没有解决。修复这个bug,介绍一个新的(你面对的),仍然是开放的。见SR-2444

解决方法迈克尔Ilseman指出作为一个临时解决方案是从可选的函数类型删除@escaping属性,保持函数作为转义。

  1. func doStuff(stuff: String,completion: Action?) {...}

猜你在找的Swift相关文章