如何在 Swift 中使用没有类型参数的泛型 class?
How to use a generic class without the type argument in Swift?
我想将一个 泛型对象 封装在另一个 class 中,而不 设置泛型类型参数。我创建了一个基础 Animal<T>
class 并从中定义了其他子class。示例:
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
}
}
但是我在这样做时遇到以下编译错误:
Reference to generic type Animal
requires arguments in <...>
.
这似乎在 Java 中运行良好。我怎样才能在 Swift 中完成同样的事情?
Swift 还不像 Java 那样支持 wildcard-style generics(即 Animal<?>
)。因此,一种常见的模式是定义一个 type-erased 超类、协议(或包装器)来启用这种用法。例如:
public class AnyAnimal {
/* non-generic methods */
}
然后将其用作您的超类:
public class Animal<T: YummyObject>: AnyAnimal {
...
}
最后,在您的非通用代码中使用 AnyAnimal
:
private static var animal: AnyAnimal!
Swift 标准库 中的示例。有关实际示例,请参阅 KeyPath
, PartialKeyPath
, and AnyKeyPath
classes hierarchy. They follow the same pattern I outlined above. The Collections framework 提供了更进一步的类型擦除示例,但使用 wrappers 代替。
我想将一个 泛型对象 封装在另一个 class 中,而不 设置泛型类型参数。我创建了一个基础 Animal<T>
class 并从中定义了其他子class。示例:
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
}
}
但是我在这样做时遇到以下编译错误:
Reference to generic type
Animal
requires arguments in<...>
.
这似乎在 Java 中运行良好。我怎样才能在 Swift 中完成同样的事情?
Swift 还不像 Java 那样支持 wildcard-style generics(即 Animal<?>
)。因此,一种常见的模式是定义一个 type-erased 超类、协议(或包装器)来启用这种用法。例如:
public class AnyAnimal {
/* non-generic methods */
}
然后将其用作您的超类:
public class Animal<T: YummyObject>: AnyAnimal {
...
}
最后,在您的非通用代码中使用 AnyAnimal
:
private static var animal: AnyAnimal!
Swift 标准库 中的示例。有关实际示例,请参阅 KeyPath
, PartialKeyPath
, and AnyKeyPath
classes hierarchy. They follow the same pattern I outlined above. The Collections framework 提供了更进一步的类型擦除示例,但使用 wrappers 代替。