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

时间:2016-07-22 15:58:52

标签: swift

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

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 个答案:

答案 0 :(得分: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]()