这很有趣。如果不按照@marcos 的建议做一些事情,我认为这是不可能的。您的问题是您可以“抛弃”元组中的名称:
let named_pair = (s: "hello", i: 1)
named_pair.s // hello
let anon_pair = named_pair as (String,Int)
// or anon_pair: (String,Int) = named_pair, if you prefer
anon_pair.s // no such member 's'
现在假设你定义了两个函数,除了一个有命名参数之外,它们是相同的:
func f(s: String, i: Int) { println("_: \(s)") }
func f(#s: String, #i: Int) { println("s: \(s)") }
然后您可以通过带有命名和未命名参数的元组调用它:
f(named_pair) // prints s: hello
f(anon_pair) // prints _: hello
// but if you try to call a named argument function with unnamed tuples:
func g(# s: String, # i: Int) { println("s: \(s)") }
g(anon_pair) // compiler error
let h = g
h(anon_pair) // compiler error
h(named_pair) // works
但是因为你可以抛弃这些名字,你可以这样做:
// compiles and runs just fine...
(g as (String,Int)->())(anon_pair)
let k: (String,Int)->() = g
// as does this
k(anon_pair)
据我所知,这种能力意味着不可能使用类型来消除仅由参数名称重载的函数的歧义。