作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个采用泛型类型的类,它必须继承自 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/
我是一名优秀的程序员,十分优秀!