最近一直在整理知识点,将所学的东西记录下来,学以致用。接下来就说说Swift中的泛型的简单应用。
话不多说,程序员就是要直接上代码:
protocol Reuseable {
static var reuseIdentifier: String { get }
static var nib: UINib? { get }
}
extension Reuseable {
static var reuseIdentifier: String {
return String(describing: self)
}
static var nib: UINib? {
return nil
}
}
首先定义一个Reuseable协议,默认实现。
// MARK: - tableview 的重用扩展
extension UITableView {
/// 注册cell方法
///
/// - Parameter cell: cell类
func register<T: UITableViewCell>(_ cell: T.Type) where T: Reuseable {
if let nib = T.nib {
register(nib, forCellReuseIdentifier: T.reuseIdentifier)
} else {
register(cell, forCellReuseIdentifier: T.reuseIdentifier)
}
}
/// 注册头尾视图的方法
///
/// - Parameter view: view类
func registerHeaderFooterView<E: UITableViewHeaderFooterView>(_ view: E.Type) where E: Reuseable {
if let nib = E.nib {
register(nib, forHeaderFooterViewReuseIdentifier: E.reuseIdentifier)
} else{
register(view, forHeaderFooterViewReuseIdentifier: E.reuseIdentifier)
}
}
/// 重用cell方法
///
/// - Parameters:
/// - _: 类型名
/// - indexPath: indexPath
/// - Returns: cell
func dequeueCell<T: UITableViewCell>(indexPath: IndexPath) -> T where T: Reuseable {
return self.dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as! T
}
/// 重用headerfooterview方法
///
/// - Parameter view: 视图名称
/// - Returns: 本身
func dequequeHeaderFooterView<E: UITableViewHeaderFooterView>() -> E where E: Reuseable {
return self.dequeueReusableHeaderFooterView(withIdentifier: E.reuseIdentifier) as! E
}
}
我们在这里对UITableView添加几个自定义的注册以及重用方法。当然了,我们也不能忘了UICollectionView。
// MARK: - collectionView 的重用扩展
extension UICollectionView {
/// 注册cell方法
///
/// - Parameter cell: 类名
func register<T: UICollectionViewCell>(_ cell: T.Type) where T: Reuseable {
if let nib = T.nib {
register(nib, forCellWithReuseIdentifier: T.reuseIdentifier)
} else {
register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
}
}
/// 重用cell方法
///
/// - Parameters:
/// - _: 类型名
/// - indexPath: indexPath
/// - Returns: cell
func dequeueCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T where T: Reuseable {
return self.dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
}
}
我们从UITableView的扩展方法中可以看出来,只要是遵循了Reuseable协议的UITableViewCell类型都可以重用。(UICollectionView同理)
那么接下来我们就来创建一个UITableViewCell试试
1、纯代码自定义cell,只需要遵循Reuseable即可。
2、对于xib创建的cell,我们需要这样做
extension CustomCell: Reuseable {
static var nib: UINib? {
return UINib(nibName: String(describing: self), bundle: nil)
}
}
这样结合UITableVIew扩展中的方法,我们获得的identifier就是CustomCell
,调用很方便:
tableView.register(CustomCell.self)
...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: CustomCell = tableView.dequeueCell(indexPath: indexPath)
return cell
}
这就是Swift中的泛型的简单应用,我们在开发过程中可以脑洞大开,多做一些尝试,利用泛型的特性去写代码,让代码变得简单快捷,而且会有很大的乐趣。