下面的代码可以在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)
I get this error:
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)
Swift判断我正在尝试做一些更奇怪的事情,然后我收到了以下信息:
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()
的原因是什么?一旦定义了,有没有任何方法来调用它?
补充说明: 我知道也可以明确指定类型来定义一个函数 h<T: AnyObject>(s: String, t: T.Type)
。我觉得值得质疑的是Swift允许我定义隐式版本。
T
。例如:func g<T: AnyObject>(s: String) -> T {...}
现在通过将其转换为func(s) as Foo
,我们不成熟的 Swift 编译器将推断出它的类型,因此无需显式传递它 :( - nacho4d