swift - 没有尾随闭包支持具有默认参数值的方法?

标签 swift

您可以将下面的代码放入 Playgrounds 中。

import UIKit

class MyClass {
  func foo(a: String, b: () -> ()) {
    b()
  }
  func bar(a: String = "a", b: () -> ()) {
    b()
  }
}

let object = MyClass()

object.foo("x") { () -> () in
  println("foo")
}

object.bar() { () -> () in
  println("foo")
}

object.bar() 调用产生调用中参数“b”缺少参数

问题是:我做错了什么,或者具有默认参数值的方法不支持尾随闭包?

最佳答案

它看起来确实像尾随闭包的问题 - 这段代码有效:

object.bar(b: {  () -> () in
    println("foo") 
})

但是,如果外部名称被删除:

func bar(a: String = "a", _ b: () -> ()) {
    b()
}

这不再有效:

object.bar({  () -> () in
    println("foo")
})

此外,使用具有字符串作为第二个参数的函数:

func test( val1: String = "a",  val2: String) {        
}

默认参数已正确分配,因此成功:

test("me")

这是与使用闭包不同的行为。

结论:如果至少有一个具有默认值的参数未指定,则具有默认值参数和尾随闭包的方法或函数将不起作用。为了避免尾随闭包,该函数仅在参数具有外部名称时才起作用。

关于swift - 没有尾随闭包支持具有默认参数值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332655/

相关文章:

ios - 如何在 mapbox 中添加所有附近的 POI?

ios - 蜂窝数据的可达性测试

使用泛型从 Swift 到 Kotlin : Protocol to Interface,

Swift - 更改常量不显示错误

ios - Xcode:WebView 在 endRefreshing() 之后刷新/重新加载

ios - CollectionView 中的单元格未显示

swift - 在 Swift 4 中通过 CFNetwork 的套接字服务器

swift - 将 ProductModuleName-Swift.h 导出到其他目标?

ios - UIScrollView 中同一个 UIView 的多个实例

ios - UITableViewCell 运行结束后图片变化