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)
答案 0 :(得分:2)
以下雷达:
在以下验证测试中标记为已修复:
L.ws[0]
基于上面的验证测试(特别是预期的错误),我认为通过存储的引用调用函数(例如,在您的示例中为c
)将不允许省略参数,即使函数指向供应这些省略的参数的默认参数值。
上面的(Int) -> ()
存储闭包(/ function reference)的类型将被推断为c
,并且不包含有关默认参数值的信息。当试图调用() - > ()
就好像它是类型为time
的闭包/函数指针时,将提示缺少的参数错误,而没有任何可能性进入直接调用函数时可用的编译器魔法(不通过存储的引用/闭包!)本身允许省略具有默认值的参数的参数。