2016-07-22 3 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> { } 

Можно определить массив и хранить CellDataA, CellDataB и т.д. в нем?

ответ

1

Нет, это не представляется возможным, потому что нет нет общего типа предок CellDataA и CellDataB. Вы могли бы подумать, что 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» на класс CellDataBase и он также работает. – Leo

Смежные вопросы