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

Swift func签名和默认参数值语法?,swift,function,closures,Swift,Function,Closures,Swift func/闭包签名是否可以指定提供默认参数值 我尝试做的一个高度简化的版本是: 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

Swift func/闭包签名是否可以指定提供默认参数值

我尝试做的一个高度简化的版本是:

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”调用中得到的错误是:
错误:调用中缺少参数2的参数

我尝试将typealias行更改为:

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

但这在typealias行中给出了一个错误:
error:tuple类型中不允许使用默认参数

这也无助于:

typealias W=((字符串,字符串?,字符串?)->Void)

以下雷达:

在以下验证测试中标记为固定:

基于上面的验证测试(特别是预期的错误),我相信通过对函数的存储引用调用函数(例如,示例中的
L.ws[0]
)将不允许忽略参数,即使指向的函数为这些忽略的参数提供了默认参数值


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

Swift不会自动生成Thunk,用于用默认参数装饰函数。尽管您的func
w
有默认参数,但其类型仍然是
(String,String,String)->Void
您到底想实现什么?@Alexander感谢您提供的宝贵意见,但我不想讨论这个问题/答案。在我看来,唯一真正的解决办法是在类型系统中引入
defaultness
,这样
a
可以有一个类型
(defaulted Int)->()
,这将同时允许
c()
c(0)
。我认为对于这个特定的用例来说,复杂性是不值得的。然而,我认为这是解决另一个问题的一种很酷的方法:可以引入一种语法来查询函数的默认值,比如
c.0.defaultValue
@Alexander。这样的一个查询功能将非常整洁!
// Test case submitted to project by https://github.com/practicalswift (practicalswift)
// http://www.openradar.me/18041799
// https://gist.github.com/stigi/336a9851cd80fdef22ed
func a(b: Int = 0) {
}
let c = a
c() // expected-error {{missing argument for parameter #1 in call}}