最近一直在整理知識(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ì)有很大的樂趣。