tableView.registerReusableCell(ShowJobTitleInfoCell.self)
protocol Reusable: class {
static var reuseIdentifier: String { get }
static var nib: UINib? { get }
}
extension Reusable {
static var reuseIdentifier: String { return String(describing: self) }
static var nib: UINib? {
let aNib = UINib(nibName: Self.reuseIdentifier, bundle: nil)
return aNib
}
}
// ----------------------------------------------------------------------------------
/// TableView
// MARK: - TableView
// ----------------------------------------------------------------------------------
extension UITableViewCell: Reusable {}
extension UITableView {
func registerReusableCell<T: UITableViewCell>(_: T.Type) {
register(T.self, forCellReuseIdentifier: T.reuseIdentifier)
}
func dequeueCell<T>(forIndexPath indexPath: IndexPath) -> T where T: UITableViewCell {
return self.dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as! T
}
func registerReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_: T.Type) where T: Reusable {
if let nib = T.nib {
self.register(nib, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
} else {
self.register(T.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
}
}
func dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>() -> T? where T: Reusable {
return self.dequeueReusableHeaderFooterView(withIdentifier: T.reuseIdentifier) as! T?
}
}
// ----------------------------------------------------------------------------------
/// CollectionView
// MARK: - CollectionView
// ----------------------------------------------------------------------------------
extension UICollectionViewCell: Reusable {}
extension UICollectionView {
func registerReusableCell<T: UICollectionViewCell>(_: T.Type) {
register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
}
func dequeueReusableCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T {
return self.dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
}
func registerReusableSupplementaryView<T: Reusable>(elementKind: String, _: T.Type) {
if let nib = T.nib {
self.register(nib, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
} else {
self.register(T.self, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
}
}
func dequeueReusableSupplementaryView<T: UICollectionViewCell>(elementKind: String, indexPath: IndexPath) -> T {
return self.dequeueReusableSupplementaryView(ofKind: elementKind, withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
}
}