2016-07-22 155 views
2

我有几个以单元数据类CellDataBase作为基类。主要思想是我可以定义新的单元格数据类并通过泛型与单元格配对。如何在swift中定义泛型类的数组

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> { } 

是否可以定义阵列和存储CellDataACellDataB等的呢?

回答

1

不,这是不可能的,因为没有共同类型始祖到CellDataACellDataB。你可能认为CellDataBase是一个共同的祖先,但它不是; U类型参数的引入意味着对于每种类型U存在完全不同的类型。

你可以尝试这样的事:

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> { } 

然后:

var databases = [CellDataBase]() 

注意,定义CellDataBase为避免“自我和相关类型的需求”的协议可能是困难的,这取决于您的需求。

====

另一个类似的选项,假设你不能改变你的CellDataBase定义是定义另一个协议,将其添加为扩展CellDataBase。像这样:

protocol GenericCellDataBase { 
    var count : UInt { get } 
} 

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

var databases = [GenericCellDataBase]() 
+1

不错的一点,我将'协议CellDataBase'替换为'class CellDataBase',它也可以。 – Leo