在 Swift 幫 UITableView 或 UICollectionView 註冊 cell class


在 Objective-C 的時代,如果要幫 UITableViewUICollectionView 註冊一個 cell 來用,需要寫像這樣的東西:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:"UniqueCellIdentifier"];

// 或是

[self.collectionView registerClass:[UICollectionViewCell class] forCellReuseIdentifier:"UniqueCellIdentifier"];

In Swift

來到 Swift 之後,我直覺的寫了像這樣的東西,結果是無法使用的:

self.tableView.registerClass(UITableViewCell.class, forCellWithReuseIdentifier: "UniqueCellIdentifier")

這時候 Xcode 即時除錯的編輯器對這一行就有些微詞了:

Consecutive statements on a line must separated by ';'
Expected ',' separator
Expected ')' in expression list
Cannot invoke 'registerClass' with no arguments
Expected identifier in class declaration
Expected member name following '.'
Expected expression in list of expressions

一看起來有點像是 Xcode 看到不懂的東西就開始胡言亂語。不過也有點像是碰到 class 這個關鍵字就開始噴出相對應有可能的錯誤出來,不過這串錯誤對當前的使用方式卻是一點關係也沒有。

於是就問了一下 Google 大神,就發現

UITableViewCell.class 換成

UITableViewCell.self

這樣子,就可以了。

雖然語意上長得有點奇怪,但是這樣就可以 run 起來了

最後,組合起來

self.tableView.registerClass(UITableViewCell.self, forCellWithReuseIdentifier: "UniqueCellIdentifier")

// 或是

self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "UniqueCellIdentifier")

這樣, Xcode 的編輯器就不再抱怨,按下 command + R 也 build 的起來了

參考