如何在Swift中優(yōu)雅地使用ReusableIdentifier

原文:如何在Swift中優(yōu)雅地使用ReusableIdentifier

蘋果為了保準UITableView視圖的性能蚂维,使用了cell的重用機制,cell可以通過重用標示符(reusableIdentifier)進行復用,默認的注冊cell和獲取cell的方法中,需要傳入一個字符串作重用標示符后添。但這種方式很容易出錯笨枯,而且使用起來也相當別扭薪丁,一種普遍的解決方式,就是直接只用類名作為重用標示符:

tableview.registerClass(UITableViewCell.self, forCellReuseIdentifier: String(UITableViewCell.self))

tableview.dequeueReusableCellWithIdentifier(String(UITableViewCell.self))

但這種寫法依然頗為繁瑣馅精,每次都要傳入一個類严嗜,并把它轉(zhuǎn)化成字符串。所幸洲敢,借助Swift的泛型特性漫玄,我們可以有更加優(yōu)雅的實現(xiàn)方式。

使用協(xié)議

使用泛型來優(yōu)化 TableView Cells 的使用體驗這篇文章中压彭,作者詳細介紹了如何通過協(xié)議+泛型的方式睦优,優(yōu)化TableView Cells 的使用體驗。具體的做法很簡單壮不,首先聲明了一個協(xié)議汗盘,提供并默認實現(xiàn)了一個reuseIdentifier靜態(tài)屬性:


protocol Reusable: class {
  static var reuseIdentifier: String { get }
}

extension Reusable {
  static var reuseIdentifier: String {
    return String(Self)
  }
}

然后提供一個注冊和獲取重用cell的方法:

func registerReusableCell<T: UITableViewCell where T: Reusable>(_: T.Type) {
     self.registerClass(T.self, forCellReuseIdentifier: T.reuseIdentifier)
  }

  func dequeueReusableCell<T: UITableViewCell where T: Reusable>(indexPath indexPath: NSIndexPath) -> T {
    return self.dequeueReusableCellWithIdentifier(T.reuseIdentifier, forIndexPath: indexPath) as! T
  }

這樣只要cell遵守了Reusable協(xié)議,就可以通過上面兩個方法注冊復用cell了询一。具體的代碼和使用隐孽,請閱讀原文:使用泛型來優(yōu)化 TableView Cells 的使用體驗

這種方式的確是比原生的方法方便了不少,但還是有一個不太方便的地方健蕊,那就是cell必須遵守了Reusable協(xié)議菱阵,雖然我們可以通過讓UITableViewCell遵守這個協(xié)議的方式,避免每個UITableViewCell子cell都寫一遍缩功,但這依然還不是最理想的解決方式晴及。最理想的解決方式,應該是只需要調(diào)用方法嫡锌,不需要UITableViewCell做任何修改抗俄,為此我們可以使用結(jié)構(gòu)體脆丁,而非協(xié)議來實現(xiàn)。

使用結(jié)構(gòu)體

我們可以使用泛型定義一個ReusableIdentifier結(jié)構(gòu)體动雹,有一個identifier的不變量:

public struct ReusableIdentifier <T: UIView> {
  let identifier: String

  init() {
    identifier = String(T.self)
  }
}

然后為UITableView實現(xiàn)一個register方法槽卫,這個方法只需要傳入一個類型即可:


extension UITableView {
    func register<T: UITableViewCell>(_: T.Type) {
    registerClass(T.self, forCellReuseIdentifier: ReusableIdentifier<T>().identifier)
    }
  }
  

如此,注冊的時候就非常簡單:tableview.register(UITableViewCell.self)胰蝠。

同樣的歼培,可以為UITableView實現(xiàn)一個dequeue方法:

@warn_unused_result
  func dequeue<T: UICollectionViewCell>(indexPath: NSIndexPath) -> T {
    let rid = ReusableIdentifier<T>()
    guard let cell = dequeueReusableCellWithReuseIdentifier(rid.identifier, forIndexPath: indexPath) as? T else {
      assertionFailure("No identifier(\(rid.identifier)) found for \(T.self)")
      return T.init()
    }
    return cell
  }

使用的時候只需要指定cell的類型,傳入indexPath即可:

let cell: UITableViewCell = tableview.dequeue(indexPath)

通過引入一個結(jié)構(gòu)體茸塞,利用泛型特性躲庄,不需要對已有的類型做任何修改,只需要替換注冊和復用cell時調(diào)用的方法钾虐,我們就可以非常優(yōu)雅的復用Tableview Cell噪窘。

參考上面的方法,我們可以借助ReusableIdentifier結(jié)構(gòu)體效扫,為UICollectionView實現(xiàn)相應的方法倔监。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菌仁,隨后出現(xiàn)的幾起案子浩习,更是在濱河造成了極大的恐慌,老刑警劉巖济丘,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱秽,死亡現(xiàn)場離奇詭異,居然都是意外死亡摹迷,警方通過查閱死者的電腦和手機疟赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峡碉,“玉大人近哟,你說我怎么就攤上這事∫旌眨” “怎么了椅挣?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塔拳。 經(jīng)常有香客問我鼠证,道長,這世上最難降的妖魔是什么靠抑? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任量九,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荠列。我一直安慰自己类浪,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布肌似。 她就那樣靜靜地躺著费就,像睡著了一般。 火紅的嫁衣襯著肌膚如雪川队。 梳的紋絲不亂的頭發(fā)上力细,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音固额,去河邊找鬼眠蚂。 笑死,一個胖子當著我的面吹牛斗躏,可吹牛的內(nèi)容都是我干的逝慧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼啄糙,長吁一口氣:“原來是場噩夢啊……” “哼笛臣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迈套,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤捐祠,失蹤者是張志新(化名)和其女友劉穎碱鳞,沒想到半個月后桑李,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡窿给,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年贵白,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崩泡。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡禁荒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出角撞,到底是詐尸還是另有隱情呛伴,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布谒所,位于F島的核電站热康,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劣领。R本人自食惡果不足惜姐军,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奕锌,春花似錦著觉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辽话,卻和暖如春葬毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡穗。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工贴捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人村砂。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓烂斋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親础废。 傳聞我的和親對象是個殘疾皇子汛骂,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,166評論 30 470
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件评腺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,121評論 4 61
  • 屬于你自己的待辦清單app(Your own to-do app) To-do list(待辦清單)app是App...
    Billionfan閱讀 3,290評論 11 10
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件帘瞭,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,067評論 3 38
  • 前年,有一次同事到我辦公室辦事聊起我們學校的有些老師建了許多的購物群芋绸,我和她也經(jīng)常在購物群里買東西媒殉,我們都是買的吃...
    明潔閱讀 435評論 3 3