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