2014-12-06 77 views
2

您可以将下面的代码放入游乐场。没有拖尾关闭支持具有默认参数值的方法吗?

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

的问题是:我做错了什么,或尾随关闭未在使用默认参数值的方法支持?

回答

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

这是一个不同的行为比使用封闭件。

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

+0

好点。谢谢。我会等一下,除非有人想出更多的东西,我会接受你的答案。你认为这是缺少的功能还是缺陷? – 2014-12-06 15:13:14

+0

考虑到没有外部名称的情况不适用于闭包,我会考虑非尾随情况的错误。好像编译器试图用默认值将闭包分配给第一个参数,忽略它的类型。至于后面的情况,我不知道......这可能是一种想要的行为,但没有记录。 – Antonio 2014-12-06 15:29:55