Swift-将重载函数分配给变量
我得到一个编译时错误,myFunc引用不明确Swift-将重载函数分配给变量,swift,Swift,我得到一个编译时错误,myFunc引用不明确 func f (s: String) -> String { return "version 1: " + s } func f(sourceString s: String) -> String { return "version 2: " + s } var myFunc: (String)-> String = f as (sourceString : String)->String 在上面的示例中,如何显式引用重载函
func f (s: String) -> String { return "version 1: " + s }
func f(sourceString s: String) -> String { return "version 2: " + s }
var myFunc: (String)-> String = f as (sourceString : String)->String
在上面的示例中,如何显式引用重载函数f的每个版本?如果我注释掉func f
的任一声明,它将编译并工作。但是我想知道如果两个函数都声明了,如何引用它们。谢谢。- 参数的数量应该有所不同
- 如果参数的数量相同,则它们的数据类型应该相同 变化
我想你做不到。您可以呼叫一个或另一个:
println(f("test")) // version 1: test
println(f(sourceString: "test")) // version 2: test
我不知道如何做你想做的事,但也许这有帮助:
var myFunc1: (String)-> String = { s in f(sourceString: s) }
var myFunc2: (String)-> String = { s in f(s) }
您现在可以拨打:
let s1 = myFunc1("one") // returns "version 2: one"
let s2 = myFunc2("two") // returns "version 1: two"
这个很有趣。我认为如果不按照@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
然后,您可以通过具有命名参数与未命名参数的元组调用它:
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)
据我所知,这种能力意味着不可能使用类型来消除仅由参数名称重载的函数的歧义。引用func f(s:String)->String{return”version 1:“+s}
:
让myFunction=f(s:)
引用func f(sourceString s:String)->String{return”版本2:“+s}
:
让myFunction=f(sourceString:)
引用另一个函数(param:Any){}:
让myFunction=另一个函数(:)
如果没有重载函数,则在引用函数时不需要明确写出参数名称。如果我的答案对您有帮助,请告诉我。我可以试着帮助更多,但不一定。Swift中的函数只允许通过外部参数名称进行区分。谢谢@IvicaM。我不知道。谢谢你的回复,马科斯。我同意不超载,我避免了这个问题。我更感兴趣的是,当唯一的区别在于命名参数时,如何指定特定的函数签名。我的兴趣同样是学术性的(因为你提到的工作是可行的)。除了单独的名称之外,还有什么方法可以消除函数引用的歧义吗?谢谢,Ivica。调用每个函数都没有问题。但我希望每个函数都有一个变量引用(函数作为一级类型,应该能够明确地指向每个函数的变量)。感谢您的周到回复。大家都在讨论这个问题。空速-我很害怕。从实用的角度来看(我总是可以重命名函数以避免重载),但从学术的角度来看更多。一种支持函数作为一级数据类型的语言出现了无法明确引用重载函数的情况,这似乎有点糟糕。好吧-我的学者很失望,但实用主义者会承认这在“现实生活”中可能永远不会出现:-)我曾想到的另一种方法是将第二种方法声明为最初分配给变量的闭包。这也行得通,但我还是希望该语言能够引用包含命名参数消歧的函数签名。