Objective-C では「カテゴリ」という仕組みを使って既存のクラスに新しいメソッドを付け加えることができます。自分で作ったクラスでもシステムが提供しているものでも付け加えることができますのでカテゴリを活用した例を紹介します。
アプリを開発しているとアプリ内で使用する色がいくつか決まってきます。これらの色を各 View などに対して直接記述することもできますが、複数の場所で同じ色を設定したい場合には処理が分散してしまい後で変更が必要になったときに都合が悪くなります。そこでカテゴリの登場です。
@interface UIColor (SGUIColorAdditions) + (UIColor *)sg_tintColor; + (UIColor *)sg_detailTextColor; + (UIColor *)sg_detailViewBackgroundColor; @end @implementation UIColor (SGUIColorAdditions) + (UIColor *)sg_tintColor { return [UIColor colorWithRed:0.376 green:0.643 blue:0.525 alpha:1.000]; } + (UIColor *)sg_detailTextColor { return [UIColor colorWithWhite:0.549 alpha:1.000]; } + (UIColor *)sg_detailViewBackgroundColor { return [UIColor colorWithPatternImage:[UIImage imageNamed:@"BackgroundPattern.png"]]; } @end
このようにすると色の変更が必要になった場合にはこのカテゴリメソッドだけ修正するだけで済みますし、クラスを作るよりも手軽です。余談ですが、上記例で “sg_” というプリフィックスを付けています。これは Objective-C ではネームスペースが1つしかない Objective-C でメソッド名の衝突を避けるための方法です。詳しくは以下の URL をご参照ください。
Google Objective-C Style Guide
Coding Guidelines for Cocoa Naming Methods
話が逸れましたが、カテゴリで他によく使う例としては汎用的に使えそうな処理やオブジェクトの生成手順が面倒なものをまとめたりします。
- NSString の URL エンコードメソッド
- OK ボタンしかないシンプルな UIAlertView のコンビニエンスメソッド
- Width を引数に持つ FixedSpace な UIBarButtonItem のコンビニエンスメソッド
- アプリ固有の URL を返す NSURL のコンビニエンスメソッド
例に挙げたもの以外にも様々なシチュエーションでカテゴリメソッドを有効に使うことでコードの保守性、可読性を上げることができます。今回は紹介していませんが iOS 3.1 以降では Associative References という仕組みが使えるようになりました。これはあるインスタンスに別のインスタンスの参照を渡せるものです。Associative References をうまく活用できればさらに便利なカテゴリメソッドができるかもしれません。