我想在不设置泛型类型参数的情况下将通用对象封装在另一个类中.我创建了一个基础Animal< T>类并从中定义其他子类.例:
- public class Animal<T: YummyObject> {
- // Code
- }
- public class Dog: Animal<Bark> {
- // Code
- }
- public class Cat: Animal<Meow> {
- // Code
- }
并在下面的UITableView扩展中定义了一个没有type参数的Animal属性:
- extension UITableView {
- private static var animal: Animal!
- func addAnimal(animal: Animal) {
- UITableView.animal = animal
- }
- }
但是这样做时我得到以下编译错误:
Reference to generic type
Animal
requires arguments in<...>
.
这似乎在Java中运行良好.我怎么能在Swift中完成同样的事情呢?
解决方法
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提供了更进一步的类型擦除示例,但使用了包装器.