如何允许泛型集合在swift中执行后台转换



我正在实现一个泛型集合,我想让它在类型/协议层次结构中的使用更加方便。我偶然发现了以下问题。

如何实现集合

class SpecialSet<ObjectType> {

使得给定两种类型的CCD_ 1可以执行从CCD_ 2到CCD_?


我很惊讶,但我找不到任何文档来解释Array集合中确实存在的这个简单概念。这个swift代码确实有效:

let b = [B(), B(), B()]
let a: [A] = b

我可能在搜索中没有使用正确的词汇。

我试图定义一个构造函数如下,但不可能强制两个泛型之间的继承。

init<T>(_ specialSet: SpecialSet<T>) where T: ObjectType {

这一直都是不可能的。

Swift泛型通常是不变的,但Swift标准库集合类型--即使这些类型看起来是常规的泛型——使用一些凡人无法使用的魔法让它们是协变的。

潜在的解决方法。‍♂️

protocol Subclass: AnyObject {
associatedtype Superclass
}
extension B: Subclass {
typealias Superclass = A
}
class SpecialSet<Object>: ExpressibleByArrayLiteral {
required init(arrayLiteral _: Object...) { }
init<T: Subclass>(_: SpecialSet<T>) where T.Superclass == Object { }
}
let specialSetB: SpecialSet = [B(), B()]
let specialSetA = SpecialSet<A>(specialSetB)

最新更新