追記 2016/11/20
便利なExtensionを見つけたので、最近はそれを使っています。
extension NSObject{
class var className: String{
return String(describing: self)
}
var className: String{
return type(of: self).className
}
}
これを使えば
let textFieldCell = UINib(nibName: InputTextFieldCell.className, bundle: nil)
self.tableView.registerNib(textFieldCell, forCellReuseIdentifier: InputTextFieldCell.className)
このように書けて、いちいち各クラスでidentiferを作る必要もなくなりました。
動機
UITableViewCellはよく使うしサブクラスも多様するが、
tableViewでよくあるやつ
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
みたいに書くといまいちだし、
IDを宣言
let reuseIdentifer = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifer, forIndexPath: indexPath)
にしても気持ち悪かったので、スマートにやれる方法を考えた。
class変数の計算型プロパティを使う
UITableViewCellのエクステンションで
UITableViewCellExtention.swift
extension UITableViewCell{
class var identifer: String{ return "Cell"}
}
このようにして、サブクラス(仮にInputTextFieldCell)
InputTextFieldCell.swift
class InputTextFieldCell: UITableViewCell {
override class var identifer: String{ return "InputTextFieldCell"}
(中略)
}
とする。
呼び出し側
let cell = tableView.dequeueReusableCellWithIdentifier(UITableViewCell.identifer, forIndexPath: indexPath)
let textFieldCell = UINib(nibName: InputTextFieldCell.identifer, bundle: nil)
self.tableView.registerNib(textFieldCell, forCellReuseIdentifier: InputTextFieldCell.identifer)
このようになる。
static let を使わない理由
static 変数はOverrideができないため、UITableViewCellでidentifierという名前を使ってしまうと以降使えないから。
終わり
よかったら試してみてください。
間違いなり指摘なりあればコメントお願いします。