如何从Generic获取实例?

时间:2015-10-02 23:08:14

标签: swift generics

我无法理解为什么会导致错误(错误显示为代码中的注释):

class SomeClass {
    var id = 123
}

class AnotherClass {
    func myFunc<T>(object: T) {
        T.id = 555 // Error: Type 'T' has no member 'id'
        object.id = 555 // Error: Value of type 'T' has no member 'id'
    }
}

let someClass = SomeClass()
let anotherClass = AnotherClass()
anotherClass.myFunc(someClass)

如何在将someClass传递给泛型函数后获取它的实例?

另外,我不能在AnotherClass中做任何命名的向下转换(正如你所期望的那样使用泛型)。

1 个答案:

答案 0 :(得分:4)

你必须更多地了解泛型。 T没有名为id的成员 - 这是正确的!只是因为你传入了某些 T,它有一个与编译器无关的成员(SomeClass),因为在其他一些点你可以插入其他东西,如Int或{{1}或任何东西。

考虑在代码中添加以下行

[Double]

应该怎么办?应该anotherClass.myFunc(1) 做什么?它会失败,因为1没有名为.id的成员。

你的id没有通用约束告诉编译器什么,因此它假设你可以传入任何东西。然后,您只能使用可能输入共享的所有属性。

您可能想要使用的是例如

T

告诉编译器您只能传入func myFunc<T : SomeClass>(object: T) { object.id = 555 } 类型的对象或扩展SomeClass的类。遵循上面的逻辑,编译器可以查看代码,所有可能的输入,并允许您执行对所有可能输入有效的操作。因此,编译器知道SomeClass属性存在,因为id具有它,并且所有扩展SomeClass的类都可以,因为这是扩展的工作方式。

apple docs on generics再一次非常适合学习从基础知识到相当复杂的用例的泛型。