Swift - 将重载函数分配给变量

时间:2015-02-02 19:08:19

标签: 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

如何在上面的示例中明确引用重载函数f的每个版本?如果我注释掉func f的任何一个声明它将编译并工作。但我想知道如果声明这两个函数,如何引用每个函数。感谢。

5 个答案:

答案 0 :(得分:5)

我不知道怎么做你想要的,但也许这会有所帮助:

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"

答案 1 :(得分:4)

有趣的一个。如果不按照@ 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)") }

然后,您可以通过名为vs unnamed arguments的元组调用它:

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)

这样做的能力意味着我无法使用类型消除仅通过参数名称重载的函数的歧义。据我所知。

答案 2 :(得分:2)

引用func f (s: String) -> String { return "version 1: " + s }

let myFunction = f(s:)

引用func f(sourceString s: String) -> String { return "version 2: " + s }

let myFunction = f(sourceString:)

引用func anotherFunction(_ param: Any) {}

let myFunction = anotherFunction(_:)

如果尚未重载该函数,则在引用该函数时无需显式写出参数名称。

答案 3 :(得分:1)

  • 参数数量应有所不同。
  • 如果参数的数量相同,那么它们的数据类型应该相同 而变化。

示例

func f(x : String) -> NSString {
        return a
    }
func f(x : UInt) -> NSString {
            return "{\(x)}"
        }

答案 4 :(得分:0)

我认为你不能。你可以打电话给其中一个:

println(f("test")) // version 1: test
println(f(sourceString: "test")) // version 2: test