Общий вопрос, есть предложения? - PullRequest
0 голосов
/ 30 мая 2018

// UITableView + .Swift Extension

extension UITableView {

 func cellForModel<T: CellViewModel>(at: IndexPath, model: T) -> T.CellType  {
    let cell: T.CellType = dequeueReusableCell()
    *let t = model as! T.CellType.ModelType*
    cell.setupModel(model: t)
    return cell
  }

  func dequeueReusableCell<T: ReusableCell>() -> T {
    print(T.reuseIdentifier())
    let temp = self.dequeueReusableCell(withIdentifier: T.reuseIdentifier())

    return temp as! T
  }
}

// CellViewModel.Swift

protocol CellViewModel where Self: NSObject, CellType: ReusableCell {
  associatedtype CellType
}

// ReusableCell.Swift

protocol ReusableCell where Self: UITableViewCell, ModelType: CellViewModel {
  associatedtype ModelType
  static func reuseIdentifier() -> String
  func setupModel(model: ModelType)
  var cell: UITableViewCell { get }
}

extension ReusableCell {
  static func reuseIdentifier() -> String {
    return String(describing: Self.self)
  }
  var cell: UITableViewCell {
    return self as UITableViewCell
  }
}

Myвопрос в том, почему мне нужно сделать let t = model as! T.CellType.ModelType в расширении UITableView, а не просто передать модель в функцию setupModel(model: ModelType).

1 Ответ

0 голосов
/ 30 мая 2018

Вам необходимо добавить ограничение CellType.ModelType == Self в CellViewModel

protocol CellViewModel where Self: NSObject, CellType: ReusableCell, CellType.ModelType == Self {
    associatedtype CellType
}
...