我有一个泛型类,我有一个泛型类型数组。不,我想根据数组中的类进行一些操作。我有2个班:人和家(没有继承)。但是这段代码不起作用:
let allValues = [T]()
if allValues[0] is Person {
let values = (allValues as [Person])
}
但这不起作用,因为 T与'Person'不同。我需要做什么?谢谢你的帮助。
答案 0 :(得分:3)
你不能这样做(或者至少,不能没有跳过一些非常曲折和不可取的篮球)。您认为T
更像Any
类型,这种类型可以包含任何其他类型,并且您可以使用as
(或可能最好{ {1}})在运行时。
但是仿制药不能像这样工作。在您的代码中,通用as?
将在编译时替换为实型,并且该类型可能不是T
。如果是这样的话,上面的代码会做什么?
您实际尝试实现的基本功能是什么?人和房子是非常不同的,所以你真的需要编写一个通用的函数吗?
答案 1 :(得分:2)
我同意 Oliver Borchert 和 Airspeed Velocity :应该使用协议解决此类问题。
但是,您可以执行使用此语法询问的演员:
let values = allValues as Any as [Person]
现在我看到两个问题:
allValues可以在第一个元素上有一个Person 否则在第二个位置。在仅评估第一个元素后,这会使演员陷入危险之中。
实施例
类LifeForm {}
class Person:LifeForm {}
T等于LifeForm。
我认为以下版本更安全,因为您直接评估类型T.
class Things<T>{
func doSomething() {
let allValues = [T]()
// populate allValues....
if T.self is Person.Type {
println("List of Person")
let values = allValues as Any as [Person]
}
}
}
重要提示:我提供此代码只是为了显示语法。我不喜欢这个abborach(再一次,一个协议会更好),因为类Things包含特定于Person的逻辑。 理想情况下事情应该对人一无所知,因为事情是一般类。