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

前端之家收集整理的这篇文章主要介绍了Swift – 将重载函数分配给变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我得到一个编译时错误,myFunc引用是不明确的.
  1. func f (s: String) -> String { return "version 1: " + s }
  2. func f(sourceString s: String) -> String { return "version 2: " + s }
  3. var myFunc: (String)-> String = f as (sourceString : String)->String

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

有趣的是这个.如果不按照@ marcos的建议行事,我认为这是不可能的.您遇到的问题是“丢弃”元组中的名称
  1. let named_pair = (s: "hello",i: 1)
  2. named_pair.s // hello
  3.  
  4. let anon_pair = named_pair as (String,Int)
  5. // or anon_pair: (String,Int) = named_pair,if you prefer
  6. anon_pair.s // no such member 's'

现在假设您定义了两个函数,除了一个具有命名参数外,它们相同:

  1. func f(s: String,i: Int) { println("_: \(s)") }
  2. func f(#s: String,#i: Int) { println("s: \(s)") }

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

  1. f(named_pair) // prints s: hello
  2. f(anon_pair) // prints _: hello
  3.  
  4. // but if you try to call a named argument function with unnamed tuples:
  5. func g(# s: String,# i: Int) { println("s: \(s)") }
  6. g(anon_pair) // compiler error
  7.  
  8. let h = g
  9. h(anon_pair) // compiler error
  10. h(named_pair) // works

但是因为你可以抛弃这些名字,你可以这样做:

  1. // compiles and runs just fine...
  2. (g as (String,Int)->())(anon_pair)
  3. let k: (String,Int)->() = g
  4. // as does this
  5. k(anon_pair)

而这种做到这一点的能力意味着,就我所知,不可能使用类型来消除仅由参数名称重载的函数的歧义.

猜你在找的Swift相关文章