泛型的應(yīng)用-UITableView的重用標(biāo)識(shí)符

最近一直在整理知識(shí)點(diǎn),將所學(xué)的東西記錄下來,學(xué)以致用。接下來就說說Swift中的泛型的簡單應(yīng)用。

話不多說,程序員就是要直接上代碼:

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
    }
}

首先定義一個(gè)Reuseable協(xié)議,默認(rèn)實(shí)現(xiàn)。

// MARK: - tableview 的重用擴(kuò)展
extension UITableView {
    /// 注冊(cè)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)
        }
    }
    /// 注冊(cè)頭尾視圖的方法
    ///
    /// - 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
    }
}

我們?cè)谶@里對(duì)UITableView添加幾個(gè)自定義的注冊(cè)以及重用方法。當(dāng)然了,我們也不能忘了UICollectionView。

// MARK: - collectionView 的重用擴(kuò)展
extension UICollectionView {
    /// 注冊(cè)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的擴(kuò)展方法中可以看出來,只要是遵循了Reuseable協(xié)議的UITableViewCell類型都可以重用。(UICollectionView同理)

那么接下來我們就來創(chuàng)建一個(gè)UITableViewCell試試

1、純代碼自定義cell,只需要遵循Reuseable即可。
2、對(duì)于xib創(chuàng)建的cell,我們需要這樣做

extension CustomCell: Reuseable {
    static var nib: UINib? {
        return UINib(nibName: String(describing: self), bundle: nil)
    }
}

這樣結(jié)合UITableVIew擴(kuò)展中的方法,我們獲得的identifier就是CustomCell,調(diào)用很方便:

tableView.register(CustomCell.self)
...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: CustomCell = tableView.dequeueCell(indexPath: indexPath)
        return cell
    }

這就是Swift中的泛型的簡單應(yīng)用,我們?cè)陂_發(fā)過程中可以腦洞大開,多做一些嘗試,利用泛型的特性去寫代碼,讓代碼變得簡單快捷,而且會(huì)有很大的樂趣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容