如何在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]()