Swift泛型类型转换

bor*_*ero 5 generics swift ios8

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

let allValues = [T]()
if allValues[0] is Person { 
     let values = (allValues as [Person])
}
Run Code Online (Sandbox Code Playgroud)

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

Air*_*ity 5

你可以\xe2\x80\x99t 这样做(或者至少,不跳过一些相当曲折和不明智的循环)。您所考虑的T更像是类型,这是一种可以容纳任何其他类型的类型,并且您可以在运行时使用(或者最好是)Any将其转回真实类型。 asas?

\n\n

但泛型并不像这样工作。在您的代码中,泛型T将在编译时替换为真实类型,并且该类型可能不是Person. 如果是这种情况,上面的代码会做什么?

\n\n

您\xe2\x80\x99实际想要实现的底层功能是什么?人和房子有很大不同,所以你真的需要编写一个对两者通用的函数吗?

\n


Luc*_*tti 4

我同意Oliver BorchertAirspeed Velocity 的观点:这种问题应该使用协议来解决。

但是,您可以使用以下语法执行您询问的转换:

let values = allValues as Any as [Person]
Run Code Online (Sandbox Code Playgroud)

现在我看到两个问题:

  1. 您的IF将崩溃,因为您的数组allValues包含 0 个元素,并且您正在访问第一个元素(不存在)。
  2. allValues 可以在第一个元素处包含一个 Person,在第二个位置处包含其他元素。仅评估第一个元素后,这会导致危险的强制转换。

    例子

    生命形式类{}

    类 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]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:我提供此代码只是为了展示语法。我不喜欢这个abborach(同样,协议会更好),因为Things 类包含特定于Person 的逻辑。理想情况下,Things应该对Person一无所知,因为Things是一个泛型类。