我无法理解为什么会导致错误(错误显示为代码中的注释):
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中做任何命名的向下转换(正如你所期望的那样使用泛型)。
答案 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再一次非常适合学习从基础知识到相当复杂的用例的泛型。