当没有参数提供泛型类型时,如何调用泛型Swift函数?

时间:2015-02-25 18:34:19

标签: swift generics

以下编译Swift REPL:

var m: [String:AnyObject] = [:]
func f<T: AnyObject>(s: String) {
    m[s] = T.self
}

但是,如果我天真地尝试调用f(),那么:

let s: String = "foo"
class Foo {}
f<Foo>(s)

我收到此错误:

repl.swift:7:1: error: cannot explicitly specialize a generic function
f<Foo>(s)
^
repl.swift:7:2: note: while parsing this '<' as a type parameter bracket
f<Foo>(s)
 ^

如果我在没有“明确专业化”的情况下尝试...

f(s)
斯威夫特决定我试图做一些甚至更奇怪的事情,我得到:

repl.swift:7:1: error: cannot convert the expression's type 'String' to type '()'
f(s)
^~~~

但是,如果我按如下方式定义新函数g()

func g<T: AnyObject>(s: String, t: T) {
    m[s] = T.self
}

并传入一个虚拟Foo实例:

g(s, Foo())

它工作正常:

> m
$R0: [String : AnyObject] = {
  [0] = {
    key = "foo"
    value = {
      instance_type = {}
    }
  }
}

那么Swift是否允许我首先定义f()?一旦定义,有没有办法调用它?


ETA:我知道也可以定义一个明确采用该类型的函数h<T: AnyObject>(s: String, t: T.Type)。事实上,Swift允许我定义我觉得有问题的隐式版本。

1 个答案:

答案 0 :(得分:4)

与其他语言不同,您无法使用如下语法显式指定泛型类型:

f<Foo>(s)

而是通过参数或返回类型推断实际类型。在您的情况下,您没有提供类型推断的方法来确定T是什么。遗憾的是,我不知道有任何方法可以使用该功能。

我的建议是明确传递T的类型:

func f<T: AnyObject>(s: String, type: T.Type) {
    m[s] = type
}

...

f(s, Foo.self)