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

时间:2017-09-30 01:08:22

标签: ios swift oop generics parametric-polymorphism

我想在另一个类中封装泛型对象,而不用设置泛型类型参数。我创建了一个基类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 中完成同样的事情?

1 个答案:

答案 0 :(得分:6)

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标准库中的示例。有关实际示例,请参阅KeyPathPartialKeyPathAnyKeyPath类层次结构。它们遵循我上面概述的相同模式。 Collections framework提供了更多类型擦除示例,但使用包装器