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

12

我希望在另一个类中封装一个通用对象,但不需要设置通用类型参数。我创建了一个基础的Animal<T>类,并从中定义了其他子类。例如:

public class Animal<T: YummyObject> {
    // Code
}

public class Dog: Animal<Bark> {
    // Code
}

public class Cat: Animal<Meow> {
    // Code
}

在下面的UITableView扩展中定义了一个Animal属性,没有使用类型参数:

extension UITableView {
    private static var animal: Animal!

    func addAnimal(animal: Animal) {
        UITableView.animal = animal
    }
}

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

引用泛型类型Animal需要在<...>中添加参数。

Java中似乎可以正常工作。如何在Swift中实现相同的功能呢?


1
请问你能给我们展示一下什么是“喵”和“汪”。它们是类还是协议?此外,你为什么想要将一个表格赋值给动物而不是某个协议呢?顺便说一句,汽车不会“喵”,它会“嘟嘟”声。 - iWheelBuy
2
@iWheelBuy 这是一个虚拟对象和类。 - ImanX
我会质疑这是否是一般情况。除非你提供更多相反的信息,否则这看起来像是协议的用例,而不是一般情况。 - matt
1个回答

13

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提供了更进一步的类型抹消示例,但是使用wrappers代替。


如果您想要删除的类型已经扩展了另一个类并且该类是泛型,则不适用。 - shoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接