protocol Reusable{ static var reuseIdentifier: String { get } } extension Reusable { static var reuseIdentifier: String { return String(Self.self) } } extension UICollectionViewCell : Reusable {} extension UICollectionView { func register(_ : T.Type) { register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier) } func dequeue(_: T.Type, for indexPath: IndexPath) -> T { return dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T; } }