繁体   English   中英

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

[英]How to use a generic class without the type argument in Swift?

我想在设置泛型类型参数的情况下通用对象封装在另一个类中。 我创建了一个基本的Animal<T>类,并从中定义了其他子类。 例:

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

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

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

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

extension UITableView {
    private static var animal: Animal!

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

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

对泛型类型Animal引用需要<...>参数。

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

Swift还不支持像Java那样的通配符式泛型 (即Animal<?> )。 因此,常见的模式是定义类型擦除的超类,协议(或包装器)来代替使​​用这种用法。 例如:

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

然后将它用作您的超类:

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

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

private static var animal: AnyAnimal!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM