LoginSignup
2
3

More than 5 years have passed since last update.

【Xcode】【Swift】NSObjectを拡張して、クラス名をString型で取得できるようにしてみた

Posted at

はじめに

独学でプログラミング学び始めて約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」のようなファイルを作成します
スクリーンショット 2016-05-06 9.46.40.png

スクリーンショット 2016-05-06 9.47.01.png

スクリーンショット 2016-05-06 9.47.21.png

・作成したファイルに以下のように記述します

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を継承しているもの以外では使えない

うーむ・・・ みなさんのコメントお待ちしてます!

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3