最近一直在整理知識點渴庆,將所學(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
}
}
首先定義一個Reuseable協(xié)議狂票,默認(rèn)實現(xiàn)。
// 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添加幾個自定義的注冊以及重用方法熙暴。當(dāng)然了闺属,我們也不能忘了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協(xié)議的UITableViewCell類型都可以重用掂器。(UICollectionView同理)
那么接下來我們就來創(chuàng)建一個UITableViewCell試試
1亚皂、純代碼自定義cell,只需要遵循Reuseable即可国瓮。
2灭必、對于xib創(chuàng)建的cell,我們需要這樣做
extension CustomCell: Reuseable {
static var nib: UINib? {
return UINib(nibName: String(describing: self), bundle: nil)
}
}
這樣結(jié)合UITableVIew擴展中的方法乃摹,我們獲得的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)用,我們在開發(fā)過程中可以腦洞大開峡懈,多做一些嘗試璃饱,利用泛型的特性去寫代碼与斤,讓代碼變得簡單快捷肪康,而且會有很大的樂趣。