以下编译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允许我定义我觉得有问题的隐式版本。
答案 0 :(得分:4)
与其他语言不同,您无法使用如下语法显式指定泛型类型:
f<Foo>(s)
而是通过参数或返回类型推断实际类型。在您的情况下,您没有提供类型推断的方法来确定T
是什么。遗憾的是,我不知道有任何方法可以使用该功能。
我的建议是明确传递T
的类型:
func f<T: AnyObject>(s: String, type: T.Type) {
m[s] = type
}
...
f(s, Foo.self)