我想在另一个类中封装泛型对象,而不用设置泛型类型参数。我创建了一个基类Animal<T>
类,并从中定义了其他子类。例如:
public class Animal<T: YummyObject> {
// Code
}
public class Dog: Animal<Bark> {
// Code
}
public class Cat: Animal<Meow> {
// Code
}
并在Animal
扩展程序中定义了一个UITableView
属性,没有类型参数:
extension UITableView {
private static var animal: Animal!
func addAnimal(animal: Animal) {
UITableView.animal = animal
}
}
但是在执行此操作时出现以下编译错误:
对通用类型
Animal
的引用需要<...>
中的参数。
这似乎在 Java 中正常工作。我怎样才能在 Swift 中完成同样的事情?
答案 0 :(得分:6)
Swift还不像Java那样支持wildcard-style generics(即Animal<?>
)。因此,常见的模式是定义类型擦除的超类,协议(或包装器)来代替使用这种用法。例如:
public class AnyAnimal {
/* non-generic methods */
}
然后将其用作您的超类:
public class Animal<T: YummyObject>: AnyAnimal {
...
}
最后,请在非通用代码中使用AnyAnimal
:
private static var animal: AnyAnimal!
Swift标准库中的示例。有关实际示例,请参阅KeyPath
,PartialKeyPath
和AnyKeyPath
类层次结构。它们遵循我上面概述的相同模式。 Collections framework提供了更多类型擦除示例,但使用包装器。