【问题标题】:Swift func signature and default parameter values syntax?Swift func 签名和默认参数值语法?
【发布时间】:2017-09-11 18:56:19
【问题描述】:

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)

但这在 typealias 行给我一个错误:error: default argument not permitted in a tuple type

这也无济于事:

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

【问题讨论】:

  • Swift 不会自动生成带有默认参数的装饰函数的 thunk。即使你的 func w 有默认参数,它的类型仍然是 (String, String, String) -> Void
  • 你到底想达到什么目的?
  • @Alexander 感谢您提供宝贵意见的帮助,但我不想参与关于此问题/答案的 XY problem 讨论。

标签: swift function closures


【解决方案1】:

以下雷达:

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

// 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}}

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

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

【讨论】:

  • 在我看来,唯一真正的解决方案是将defaultness 引入类型系统,以便a 可以具有(defaulted Int) -> () 类型,这将允许@987654333 @ 和 c(0),下线。对于这个特定的用例,我认为复杂性不值得。但是,我认为这将是解决另一个问题的一种很酷的方法:您可以引入一种语法来查询函数的默认值,例如 c.0.defaultValue
  • @Alexander 同意了。这样的查询功能确实很整洁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2016-08-30
  • 2017-08-24
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多