如何在swift中定义泛型类数组

如何在swift中定义泛型类数组,swift,Swift,我有几个单元格数据类,其中CellDataBase为基类。主要思想是,我可以定义新的cell数据类,并通过泛型将其与cell配对 public class CellBase { } public class CellA: CellBase { } public class CellB: CellBase { } public class CellDataBase<U: CellBase> { var cellType: U.Type = U.self } class

我有几个单元格数据类,其中
CellDataBase
为基类。主要思想是,我可以定义新的cell数据类,并通过泛型将其与cell配对

public class CellBase { }

public class CellA: CellBase { }

public class CellB: CellBase { }


public class CellDataBase<U: CellBase> {
    var cellType: U.Type = U.self
}

class CellDataA: CellDataBase<CellA> { }

class CellDataB: CellDataBase<CellB> { }
公共类CellBase{}
公共类CellA:CellBase{}
公共类CellB:CellBase{}
公共类数据库{
变量单元格类型:U.Type=U.self
}
类CellDataA:CellDataBase{}
类CellDataB:CellDataBase{}

是否可以定义数组并在其中存储
CellDataA
CellDataB
等?

否,这是不可能的,因为
CellDataA
CellDataB
存在No公共类型祖先。您可能认为
CellDataBase
是一个共同的祖先,但事实并非如此;
U
type参数的引入意味着每个类型都有一个完全不同的类型

您可以尝试以下方法:

protocol CellDataBase {
  // avoid `Self` and `associatedType`
  // ...

  var count : UInt { get } // number of items in database..

  // ...
}

public class StandardCellDataBase<U: CellBase> : CellDataBase { ... }
class CellDataA: StandardCellDataBase <CellA> { }
class CellDataB: StandardCellDataBase <CellB> { }
请注意,根据您的需要,将
CellDataBase
定义为避免“自我和关联类型需求”的协议可能很困难

==

另一个类似的选项是,假设您无法更改
CellDataBase
的定义,则定义另一个协议并将其添加为
CellDataBase
的扩展。例如:

protocol GenericCellDataBase {
  var count : UInt { get }
}

extension CellDataBase : GenericCellDataBase {
  var count : UInt { return ... }
}

var databases = [GenericCellDataBase]()

不错,我已经将
协议CellDataBase
替换为
类CellDataBase
,而且它也可以工作。
protocol GenericCellDataBase {
  var count : UInt { get }
}

extension CellDataBase : GenericCellDataBase {
  var count : UInt { return ... }
}

var databases = [GenericCellDataBase]()