我想在不设置通用类型参数的情况下将通用对象封装在另一个类中。我创建了一个基类,并从中定义了其他子类。例: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中完成同样的事情?
Swift尚未像Java一样支持通配符样式的泛型Animal<?>
。这样,一种常见的模式是定义一个类型擦除的超类,协议(或包装器)来启用这种用法。例如:
public class AnyAnimal {
/* non-generic methods */
}
然后将其用作您的超类:
public class Animal<T: YummyObject>: AnyAnimal {
...
}
最后,AnyAnimal
改为在您的非通用代码中使用:
private static var animal: AnyAnimal!
Swift标准库中的示例。对于一个实际的例子,看到了KeyPath
,PartialKeyPath
和AnyKeyPath
类层次结构。它们遵循我上面概述的相同模式。的集合框架提供甚至进一步型擦除的例子,但使用包装器来代替。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句