Swift func签名和默认参数值语法?

时间:2017-04-15 18:30:09

标签: swift function closures

Swift func / closure签名是否可以指定提供默​​认参数值?

我试图做的高度简化的版本是:

struct L {
    typealias W = ((String, String, String) -> Void)
    static func w(_ w:String, _ t:String = "t", _ f:String = "f") {
        let line = w + t + f
        print(line)
    }
    static let ws:[W] = [L.w, L.w]
}

L.ws[0]("sue", "seven", "red")
L.ws[0]("bill")

我在" bill"中得到的错误电话是:error: missing argument for parameter #2 in call

我尝试将typealias行更改为:

typealias W = ((String, String = "t", String = "f") -> Void)

但是这给了我一个错误的类型:error: default argument not permitted in a tuple type

这也无济于事:

typealias W = ((String, String?, String?) -> Void)

1 个答案:

答案 0 :(得分:2)

以下雷达:

在以下验证测试中标记为已修复:

L.ws[0]

基于上面的验证测试(特别是预期的错误),我认为通过存储的引用调用函数(例如,在您的示例中为c)将不允许省略参数,即使函数指向供应这些省略的参数的默认参数值。

上面的(Int) -> ()存储闭包(/ function reference)的类型将被推断为c,并且不包含有关默认参数值的信息。当试图调用() - > ()就好像它是类型为time的闭包/函数指针时,将提示缺少的参数错误,而没有任何可能性进入直接调用函数时可用的编译器魔法(不通过存储的引用/闭包!)本身允许省略具有默认值的参数的参数。