はじめに
独学でプログラミング学び始めて約1年、業務でプログラムを書き始めて2ヶ月、Swift始めて1ヶ月のSwifterです。
タイトルの通り、NSObjectを拡張してクラス名を取得できるようにしてみました。Storyboard使わずにxibを使って画面遷移したり、自作のUITableViewCellを使っていたりすると、こんな感じでクラス名を文字列指定したい場面が出てきますが、ここを簡略化、タイプミスのリスクを軽減できます
例)
ViewController.swift
let vc = ViewController("ViewController", bundle:nil)
self.tableView.registerNib(UINib.init("MyTableViewCell", bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
手順
・「New File...」から新しく「NSObject+ClassName.swift」のようなファイルを作成します


・作成したファイルに以下のように記述します
NSObject+ClassName.swift
import Foundation
extension NSObject {
class func className() -> String {
return String(NSStringFromClass(self).componentsSeparatedByString(".").last!)
}
}
こうすることで、これが
ViewController.swift
let vc = ViewController("ViewController", bundle:nil)
self.tableView.registerNib(UINib.init("MyTableViewCell", bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
こんな感じで使える
ViewController.swift
let vc = ViewController(ViewController.className(), bundle:nil)
self.tableView.registerNib(UINib.init(MyTableViewCell.className(), bundle: nil), forCellReuseIdentifier: MyTableViewCell.className())
結論
素敵。
改善点
- クラスメソッドなのでインスタンスでは使用できない → インスタンスからクラス名取得したい時ってあったっけ・・・?
- NSObjectを継承しているもの以外では使えない
うーむ・・・ みなさんのコメントお待ちしてます!