Subclassing with generics


My notes on Subclassing with generics

Base:

class Card<T:CardDataKind>:UIView{
    /**
     * When you set the data diferent UI's are updated
     */
    var data:T?
}
protocol CardDataKind{/*Add required variables here, if needed*/}

Model:

struct TopCardData:CardDataKind{
   let title:String
   let content:String
}
struct MiddleCardData:CellDataKind{
   let content:String
   let date:Date
}
struct BottomCardData:CellDataKind{
   let title:String
}

SubClasses:

class TopCard:Card<TopCardData> {
   lazy var dateLabel:UILabel = createDateLabel()
   lazy var contentLable:UITextView = createContentLabel()
   /**
    * When you set the data different UI's are updated
    */
   override var data: TopCardData? {
      didSet {
         guard let data:TopCardData = data else {fatalError("data not available")}
         titleLabel.text = data.title
         contentLable.text = data.content
      }
   }
}

Usage

let card:TopCard = .init())
card.data = TopCardData(title:"Some title",content:"Some content goes here")

Final note:

This subclassing with generics also works with UITableView cell dequeuing and registering. See example in the FlowLayout project: https://github.com/eonist/FlowLayout

img