Objective-Cの言語仕様(カテゴリ編)

カテゴリ

Rubyオープンクラスにmoduleをincludeするように、独自のクラスを拡張できる仕様。

一般的な命名規則
クラス名 + カテゴリ名. h
クラス名 + カテゴリ名.m

というファイル名にするのが一般的。

まずRubyの例から(moduleで拡張)

Stringクラスをmoduleで拡張。

module PlusHoge
  def print_foo
    print self + "foo" + "\n";
  end

  def print_piyo
    print self + "piyo" + "\n";
  end
end

class String
   include PlusHoge
end


"AAA".print_foo
"BBB".print_piyo

結果

AAAfoo
BBBpiyo

Objective-Cの例(カテゴリで拡張)

NSString+Hoge.h
#import <Foundation/Foundation.h>

@interface NSString (Hoge)

-(void) printFoo;
-(void) printPiyo;

@end
NSString+Hoge.m
#import "NSString+Hoge.h"

@implementation NSString (Hoge)

-(void)printFoo
{
    NSString *tmp = [NSString stringWithFormat:@"%@%@", self, @"foo"];
    NSLog(@"%@", tmp);
}

-(void)printPiyo
{
    NSString *tmp = [NSString stringWithFormat:@"%@%@", self, @"piyo"];
    NSLog(@"%@", tmp);
}

@end
使うファイル
#import "NSString+Hoge.h"

関数 {
    [@"AAA" printFoo];
    [@"BBB" printPiyo];
}

結果

2012-03-15 16:08:22.832 RENSYU[2332:f803] AAAfoo
2012-03-15 16:08:22.834 RENSYU[2332:f803] BBBpiyo

まとめ

  • Rubyはmoduleをつくってinclude
  • Obj-Cはカテゴリつくってヘッダーファイルを#import

で拡張。