Swift func签名和默认参数值语法?
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
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,用于用默认参数装饰函数。尽管您的funcw
有默认参数,但其类型仍然是(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}}