2017-09-30 33 views
5

我想封装一个通用对象另一类没有设置泛型类型参数。我创建了一个基类Animal<T>,并从中定义了其他的子类。例如:如何在Swift中使用不带类型参数的泛型类?

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

能否请你告诉我们什么是喵和树皮。它是一个类,还是一个协议。此外,你想给动物分配一张表的原因是什么,而不是一些协议。顺便说一句,汽车不喵喵叫,它发出蜂鸣 – iWheelBuy

+2

@iWheelBuy这是一个虚拟的对象和类 –

+0

我会怀疑这是否是一般情况。除非您显示更多相反的信息,否则这看起来像是协议的用例,而不是通用的。 – matt

回答

4

斯威夫特还不支持wildcard-style generics像Java那样(即Animal<?>)。这样,一个共同的模式是定义一个型擦除超类,协议(或包装器),以使这样的使用来代替。例如:

public class AnyAnimal { 
    /* non-generic methods */ 
} 

,然后用它作为你的超:

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

最后,在非通用代码中使用AnyAnimal代替:在斯威夫特标准

private static var animal: AnyAnimal! 

例子图书馆。对于一个实际的例子,看到KeyPathPartialKeyPath,并AnyKeyPath类层次结构。它们遵循上面概述的相同模式。 Collections framework提供了更多的类型擦除示例,但使用包装代替。

相关问题