[Swift 3] 文字列をベタ書きせずにUITableViewCellのセルIDをクラス名にする方法

2016.10.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは!モバイルアプリサービス部の加藤潤です。
今回はちょっとしたTipsを。

Xcodeでプロジェクト作成時にMaster-Detail Applicationテンプレートを選択して作成した場合、MasterViewControllerUITableViewControllerのサブクラスになっていて、セルを生成して返すメソッドは以下のような実装になっています。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    let object = objects[indexPath.row] as! NSDate
    cell.textLabel!.text = object.description
    return cell
}

withIdentifierのところでセルのIDを指定していますが、"Cell"という文字列を指定しています。このセルIDは以下のようにstoryboard側でも同じIDを指定する必要があります。

cell_id

セルのIDを何にするか

1つのアプリ内で複数のUITableViewCellのサブクラスを作成して使う場合、「セルのIDを何にするか」、「どういったルールでIDをつけるか」は重要になってきます。 前述の通り、ソースコードとstoryboardで同じIDにする必要があるため一定のルールを決めておいた方が良いでしょう。そのルールとして私がよく採用しているのが、「セルのIDとしてセルのクラス名を採用する」です。 このルールであればセルのIDを何にするか都度悩む必要も無くなりますし、他のIDと重複することも無くなります。

では、withIdentifier: "Cell""Cell"のところをクラス名の文字列に変更して...

と思うかもしれませんが文字列をベタで書くのはタイポの可能性もあるのであまりよろしくないですね。

というわけで前置きが少し長くなりましたが、今回はセルのIDをクラス名にする(しかもも文字列をベタで書かない)方法をご紹介します。

開発環境

  • Xcode Version 8.0 (8A218a)
  • Swift 3.0

再利用IDを取得可能にするプロトコルを作成する

セルのIDをクラス名にするとはつまり、セルが自身のクラス名を返すようなインタフェースを備えれば良いということになります。
そこで、以下のようにReusableというプロトコルを実装します。

import Foundation

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

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

reuseIdentifierというプロパティを1つだけ持つプロトコルです。 このプロパティは当該プロトコルに準拠したオブジェクトの型名を返します。

Reusableプロトコルに準拠する

Reusableプロトコルを作成したので以下のようにUITableViewCellのサブクラスで当該プロトコルに準拠します。

// UITableViewCellのサブクラス
class MyTableViewCell: UITableViewCell {
}

// Reusableプロトコルに準拠
extension MyTableViewCell: Reusable {}

reuseIdentifierを使ってセルを取得する

ここまで出来たら後は使うだけです。

// MyTableViewCell.reuseIdentifierで"MyTableViewCell"が返る
let cell = tableView.dequeueReusableCell(withIdentifier: MyTableViewCell.reuseIdentifier, for: indexPath)

(Reusableプロトコルに準拠したオブジェクト).reuseIdentifierで型名が取得できます。 これでもうセルのIDベタ書きとはオサラバですね!

おわりに

今回は文字列をベタ書きせずにUITableViewCellのセルIDをクラス名にする方法をご紹介しました。ちなみに今回ご紹介した方法はUITableViewCellだけでなくUICollectionViewCellでも同様に使えます。よかったらお試しください。