【发布时间】:2014-07-02 22:37:31
【问题描述】:
在我的应用程序中,我想创建一个泛型方法,该方法根据给定类型 T 创建一个对象数组。
我创建了以下函数:
func getArray<T : ROJSONObject>(key:String) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
现在我想在调用方法时传递类型,因此它确实知道应该在内部创建哪种类型。我认为在 Java 和 C# 中你可以使用这样的方法:
object.getArray<Document>("key")
当我这样称呼它时,我总是得到错误:
Cannot explicitly specialize a generic function
所以我的解决方法是定义一个包含类型 T 实例的附加参数,以便它自动检测类型:
func getArray<T : ROJSONObject>(key:String, type:T) -> T[] {
var elements = T[]()
for jsonValue in getValue(key).array! {
var element = T()
element.jsonData = jsonValue
elements.append(element)
}
return elements
}
真的没有其他方法可以在不传递未使用的实例的情况下获得该行为吗?还是我误解了什么?
进一步测试
在回答 jtbandes 之后,我进行了更多测试。我试图通过在调用中添加as 来强制类型。
class Person {
init() { }
func getWorkingHours() -> Float {
return 40.0
}
}
class Boss : Person {
override func getWorkingHours() -> Float {
println(100.0)
return 100.0
}
}
class Worker : Person {
override func getWorkingHours() -> Float {
println(42.0)
return 42.0
}
}
func getWorkingHours<T : Person>() -> T {
var person = T()
person.getWorkingHours()
return person
}
var worker:Worker = getWorkingHours() as Worker
var boss:Boss = getWorkingHours() as Boss
worker.getWorkingHours() // prints out 40.0 instead of 42.0
boss.getWorkingHours() // prints out 40.0 instead of 100.0
所以不知何故,即使我用as 关键字指定了类型,该类型也始终是基本类型。我知道这个例子没有多大意义,但它只是为了测试目的..
【问题讨论】:
-
哦,没有 Swift 类型系统被完全破坏(再一次)。此外,如果基类是从 NSObject 继承的,它“有效”。 code here
-
答案很简单。您必须以某种方式指定类型,以便将其作为
object.getArray("key") as [Document]
标签: generics swift type-inference