// // UITableView+Identifiable.swift // Bio // // Created by Joan Disho on 22.07.18. // Copyright © 2018 Joan Disho. All rights reserved. // import UIKit extension UITableView { func register(cellType: T.Type) where T: ClassIdentifiable { register(cellType.self, forCellReuseIdentifier: cellType.reuseId) } func register(cellType: T.Type) where T: NibIdentifiable & ClassIdentifiable { register(cellType.nib, forCellReuseIdentifier: cellType.reuseId) } func registerHeaderFooter(viewType: T.Type) where T: ClassIdentifiable { register(viewType.self, forHeaderFooterViewReuseIdentifier: viewType.reuseId) } func registerHeaderFooter(viewType: T.Type) where T: NibIdentifiable & ClassIdentifiable { register(viewType.nib, forHeaderFooterViewReuseIdentifier: viewType.reuseId) } func dequeueReusableCell(withCellType type: T.Type = T.self) -> T where T: ClassIdentifiable { guard let cell = dequeueReusableCell(withIdentifier: type.reuseId) as? T else { fatalError("Couldn't dequeue a UITableViewCell with identifier: \(type.reuseId)") } return cell } func dequeueResuableCell(withCellType type: T.Type = T.self, forIndexPath indexPath: IndexPath) -> T where T: ClassIdentifiable { guard let cell = dequeueReusableCell(withIdentifier: type.reuseId, for: indexPath) as? T else { fatalError("Couldn't dequeue a UITableViewCell with identifier: \(type.reuseId)") } return cell } func dequeueResuableHeaderFooterView(withViewType type: T.Type) -> T where T: ClassIdentifiable { guard let headerFooterView = self.dequeueReusableHeaderFooterView(withIdentifier: type.reuseId) as? T else { fatalError("Couldn't dequeue a UITableViewHeaderFooterView with identifier: \(type.reuseId)") } return headerFooterView } }