Swift編程最佳體驗(yàn)之Generic + Protocol + Extension

關(guān)于Swift代碼風(fēng)格,能讓絕大部分人的眼前一亮,WTF?還能這樣寫?今天就帶來(lái)一段Swift常見(jiàn)的Generic + Protocol + Extension基礎(chǔ)代碼。
知識(shí)點(diǎn)介紹:
1.Generic,泛型便是擁有共同特性的類型的代表,定義特定的泛型去書寫代碼,免去了很多不必要的事情。
2.Protocol,不做很多解釋,你遵守我的協(xié)議就要幫我去做規(guī)定的事情。
3.Extension,為我們的日常代碼模塊化提供了很大的便利,讓代碼拓展更加輕松。

今天用這種方式實(shí)現(xiàn)UITableView方法做一些封裝。

比如這樣的代碼:

let cellIdentifier = "cellIdentifier"
let cell = tableView.dequeueReusableCell(withReuseIdentifier: cellIdentifier)

長(zhǎng)此以往,你或許已經(jīng)厭倦了這種方式。

今天的學(xué)習(xí)便是為此而開(kāi)展的,Go!

在Swift中,可以給Extension去實(shí)現(xiàn)一些底層的代碼,那么就意味著我們不用每次必須遵守協(xié)議、實(shí)現(xiàn)協(xié)議,因?yàn)槟憧梢栽贑lass的擴(kuò)展中讓它自己去實(shí)現(xiàn)。Excuse me?他自己都實(shí)現(xiàn)了,要我們何用?答案一會(huì)就知道。

1.首先聲明一個(gè)協(xié)議,并利用自身的拓展去實(shí)現(xiàn)這個(gè)協(xié)議
protocol Reusable {
    /// 為cell準(zhǔn)備的Identifier
    static var just_Idnentifier: String { get }
}
extension Reusable {
    /// 利用自己的擴(kuò)展實(shí)現(xiàn)自己
    static var just_Idnentifier: String {
        return String(describing: self)
    }
}
2.然后讓UITableViewCell遵守上面的協(xié)議
// MARK: - 遵守這個(gè)協(xié)議,且什么都不用操作,我們便有了just_Identifier這個(gè)屬性
extension UITableViewCell: Reusable { }
3.準(zhǔn)備工作到這里就結(jié)束了,接下來(lái)我們將用到泛型Generic,我們用一個(gè)UITableView的擴(kuò)展去添加一些方法
extension UITableView {
    func just_dequeueReusableCell<T: UITableViewCell>(_: T.Type) -> T where T: Reusable {
        guard let cell = self.dequeueReusableCell(withIdentifier: T.just_Idnentifier) as? T else {
            fatalError("Could not dequeue cell with identifier: \(T.just_Idnentifier)")
        }
        return cell
    }
    func just_registerNib<T: UITableViewCell>(_: T.Type) {
        register(UINib(nibName: T.just_Idnentifier, bundle: nil), forCellReuseIdentifier: T.just_Idnentifier)
    }
}
最后:接下來(lái)讓咱們?nèi)タ匆幌率褂?/h5>
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.just_registerNib(DemoCell.self)
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.just_dequeueReusableCell(DemoCell.self)
        cell.textLabel?.text = "Swift 最佳編程體驗(yàn)之 \(indexPath.row)"
        return cell
    }

這種方式是不是清爽了不少,且代碼更不容易出錯(cuò),逼格也上去了,所以還等什么呢?

最后附上Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 原文:Generics Manifesto -- Douglas Gregor 譯者注 在我慢慢地深入使用 Swi...
    kemchenj閱讀 2,090評(píng)論 0 6
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,229評(píng)論 4 61
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無(wú)灃閱讀 1,512評(píng)論 0 4
  • 《人間詞話》的作者王國(guó)維,初名國(guó)楨,字靜安,亦字伯隅,初號(hào)禮堂,晚號(hào)觀堂,又號(hào)永觀,謚忠愨。是中國(guó)近、現(xiàn)代相交時(shí)期...
    我是代魚魚閱讀 901評(píng)論 8 9
  • 覺(jué)秋 /深山老林(千年桃妖) 北友頻秋意 南嶺終覺(jué)早 當(dāng)空日正熾 不亞酷暑毒 今來(lái)湯湯雨 愕然絕蛙鳴 薄裙不勝?zèng)?..
    深山老林千年桃妖閱讀 252評(píng)論 1 2