ios – 如何在Swift中使用没有类型参数的泛型类?

前端之家收集整理的这篇文章主要介绍了ios – 如何在Swift中使用没有类型参数的泛型类?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在不设置泛型类型参数的情况下将通用对象封装在另一个类中.我创建了一个基础Animal< T>类并从中定义其他子类.例:
  1. public class Animal<T: YummyObject> {
  2. // Code
  3. }
  4.  
  5. public class Dog: Animal<Bark> {
  6. // Code
  7. }
  8.  
  9. public class Cat: Animal<Meow> {
  10. // Code
  11. }

并在下面的UITableView扩展中定义了一个没有type参数的Animal属性

  1. extension UITableView {
  2. private static var animal: Animal!
  3.  
  4. func addAnimal(animal: Animal) {
  5. UITableView.animal = animal
  6. }
  7. }

但是这样做时我得到以下编译错误

Reference to generic type Animal requires arguments in <...>.

这似乎在Java中运行良好.我怎么能在Swift中完成同样的事情呢?

解决方法

Swift还不像Java那样支持 wildcard-style generics(即Animal<?>).因此,常见的模式是定义类型擦除的超类,协议(或包装器)来代替使​​用这种用法.例如:
  1. public class AnyAnimal {
  2. /* non-generic methods */
  3. }

然后将它用作您的超类:

  1. public class Animal<T: YummyObject>: AnyAnimal {
  2. ...
  3. }

最后,在非通用代码中使用AnyAnimal:

  1. private static var animal: AnyAnimal!

Swift标准库中的示例.有关实际示例,请参阅KeyPath,PartialKeyPathAnyKeyPath类层次结构.它们遵循我上面概述的相同模式. Collections framework提供了更进一步的类型擦除示例,但使用了包装器.

猜你在找的iOS相关文章