泛型的应用-UITableView的重用标识符

2018-10-16  本文已影响33人  yyyyy先生

最近一直在整理知识点,将所学的东西记录下来,学以致用。接下来就说说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中的泛型的简单应用,我们在开发过程中可以脑洞大开,多做一些尝试,利用泛型的特性去写代码,让代码变得简单快捷,而且会有很大的乐趣。

上一篇下一篇

猜你喜欢

热点阅读