swift - 略有不同的泛型数组

标签 swift generics

我有一个采用泛型类型的类,它必须继承自 WorldObject 类:

class WorldObjectsProvider<WorldObjectType: WorldObject> 

此类将创建类 WorldObjectType 的对象并在一个函数中返回它们。现在我想创建一个此类类的数组 (WorldObjectsProvider),但我希望这个数组能够保留许多不同类型的通用类 WorldObjectsProvider,例如:

class TestObject: WorldObject { }
let providers: [WorldObjectsProvider<WorldObject>] = [WorldObjectsProvider<WorldObject>(), WorldObjectsProvider<TestObject>()]

总的来说,我认为这是可能的,因为所有泛型类型都应该继承自 WorldObject。这可以通过将所有值作为对基类 WorldObject 的引用返回来实现。但我想这对于泛型来说可能太多了。有什么方法可以创建这样的数组吗?

最佳答案

Swift 泛型类型在它们的泛型参数方面是不变的,这意味着 MyGeneric<A>MyGeneric<B> 不兼容, 即使A: B .

话虽这么说,如果您需要使用两种不同的泛型,则这两种泛型需要一个共同点。类型橡皮擦是可能的解决方案之一:

struct AnyProvider<T: WorldObject> {
    init<U: WorldObject>(_ provider: WorldObjectsProvider<U>) { }
}

let providers: [AnyProvider<WorldObject>] = [AnyProvider(WorldObjectsProvider<WorldObject>()), AnyProvider(WorldObjectsProvider<TestObject>())]

这将允许您在同一集合中使用多种类型的泛型,前提是它们具有共同点。缺点是类型橡皮擦可能必须模仿和转发原始类型的所有公共(public)方法。

例如,如果原始提供者有一个 func someProviderMethod()方法,然后 AnyProvider还必须声明它:

struct AnyProvider<T: WorldObject> {
    private let _someProviderMethod: () -> Void

    init<U: WorldObject>(_ provider: WorldObjectsProvider<U>) {
        _someProviderMethod = provider.someProviderMethod
    }

    func someProviderMethod() {
        _someProviderMethod()
    }
}

关于swift - 略有不同的泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914509/

相关文章:

Java:使用非默认构造函数实例化通用对象

Java泛型可分配性

ios - Swift 5 : Why swift 5 update ask to forcibly unwrap the label. 字体?

java - Java 泛型的问题

swift - 如何通过仅查看选项卡栏图标来使选项卡栏背景透明?

swift - 快速将内联标签添加到 UIPicker

java - PECS 不适用于具有接口(interface)的返回类型

scala - Scala 的类型删除如何用于更高种类的类型参数?

swift - 我可以将按钮放入单独的 View 中吗?

ios - 动态 Tableviewcell 中的按钮不可点击