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

时间:2014-12-06 14:24:09

标签: swift

您可以将以下代码放入游乐场。

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()来电会产生Missing argument for parameter 'b' in call

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

1 个答案:

答案 0 :(得分:2)

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

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")

这与使用闭包不同。

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