2016-07-22 39 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