Ali*_*ani 8 oop generics ios parametric-polymorphism swift
我想在不设置泛型类型参数的情况下将通用对象封装在另一个类中.我创建了一个基类并从中定义了其他子类.例:Animal<T>
public class Animal<T: YummyObject> {
// Code
}
public class Dog: Animal<Bark> {
// Code
}
public class Cat: Animal<Meow> {
// Code
}
Run Code Online (Sandbox Code Playgroud)
并在下面的扩展名中定义了一个没有 type参数的Animal
属性:UITableView
extension UITableView {
private static var animal: Animal!
func addAnimal(animal: Animal) {
UITableView.animal = animal
}
}
Run Code Online (Sandbox Code Playgroud)
但是这样做时我得到以下编译错误:
对泛型类型的引用
Animal
需要参数<...>
.
这似乎在Java中运行良好.我怎么能在Swift中完成同样的事情呢?
Swift还不支持像Java那样的通配符式泛型(即Animal<?>
).因此,常见的模式是定义类型擦除的超类,协议(或包装器)来代替使用这种用法.例如:
public class AnyAnimal {
/* non-generic methods */
}
Run Code Online (Sandbox Code Playgroud)
然后将它用作您的超类:
public class Animal<T: YummyObject>: AnyAnimal {
...
}
Run Code Online (Sandbox Code Playgroud)
最后,AnyAnimal
在您的非通用代码中使用:
private static var animal: AnyAnimal!
Run Code Online (Sandbox Code Playgroud)
Swift标准库中的示例.对于一个实际的例子,看到了KeyPath
,PartialKeyPath
和AnyKeyPath
类层次结构.它们遵循我上面概述的相同模式.的集合框架提供甚至进一步型擦除的例子,但使用包装器来代替.
归档时间: |
|
查看次数: |
1651 次 |
最近记录: |