Swift泛型类型转换

时间:2014-12-21 16:32:22

标签: generics swift ios8

我有一个泛型类,我有一个泛型类型数组。不,我想根据数组中的类进行一些操作。我有2个班:人和家(没有继承)。但是这段代码不起作用:

let allValues = [T]()
if allValues[0] is Person { 
     let values = (allValues as [Person])
}

但这不起作用,因为 T与'Person'不同。我需要做什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

你不能这样做(或者至少,不能没有跳过一些非常曲折和不可取的篮球)。您认为T更像Any类型,这种类型可以包含任何其他类型,并且您可以使用as(或可能最好{ {1}})在运行时。

但是仿制药不能像这样工作。在您的代码中,通用as?将在编译时替换为实型,并且该类型可能不是T。如果是这样的话,上面的代码会做什么?

您实际尝试实现的基本功能是什么?人和房子是非常不同的,所以你真的需要编写一个通用的函数吗?

答案 1 :(得分:2)

我同意 Oliver Borchert Airspeed Velocity :应该使用协议解决此类问题。

但是,您可以执行使用此语法询问的演员:

let values = allValues as Any as [Person]

现在我看到两个问题:

  1. 您的 IF 会崩溃,因为您的数组 allValues 包含0 元素,你正在访问第一个(不存在)。
  2. allValues可以在第一个元素上有一个Person 否则在第二个位置。在仅评估第一个元素后,这会使演员陷入危险之中。

    实施例

    类LifeForm {}

    class Person:LifeForm {}

    T等于LifeForm。

  3. 我认为以下版本更安全,因为您直接评估类型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的逻辑。 理想情况下事情应该对一无所知,因为事情是一般类。