【Objective-C】ヘッダファイルをまとめた場合のカテゴリ定義のやり方【Xcode10.2対応】

こういう人に向けて発信しています。
・カテゴリを活用したい人
・ヘッダファイルに連ねて記述する方法を知りたい人
・Objective-C初心者

カテゴリとは

同じクラス内で記述が膨大になっている時など、
別のクラスに同じようなメソッドを分割して記載する事ができます。

カテゴリ名で機能を分かりやすく明記すれば、
機能ごとにクラスを分けるという事もできるので、
使えるのなら使ってみましょう。

今回の構成

・ViewController.h
・ViewController.m
・ViewController+addFunction.m

ViewController+addFunction.hが存在しないのが今回の味噌です。
どちらかといえばヘッダファイルを一つにまとめた方が、
初見での解析漏れなども防げるので、いいのかなとは思います。

例:知らない部分のメソッドが動いていたなど。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

//カテゴリ
@interface ViewController (addFunction)
- (NSString *)returnString;
@end

ViewController.m

#import "ViewController.h"

///クラスエクステンション部分:START
///クラスエクステンションにはカテゴリで参照できないインスタンス変数を宣言する。
@interface ViewController ()

@end
///クラスエクステンション部分:END

@implementation ViewController{
    UIView *view;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setView];
    NSString *str = [self returnString];  //カテゴリ(addFunction)から呼び出したメソッド
}

-(void)setView{
    CGRect rect = self.view.frame;
    view = [[UIView alloc]initWithFrame:rect];
    view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:view];
}

@end

ViewController+addFunction.m

#import "ViewController.h"

@implementation ViewController (addFunction)
///viewDidLoadなどは記載しない

- (NSString *)returnString{
    return @"カテゴリからNSStringを返す";
}

@end

要点解説

ViewController.mではクラスエクステンションと呼ばれる部分を
あえて採用しています。

これはカテゴリのクラスから参照できないインスタンス変数です。
普段意識する事はないと思いますが、
こういった特徴があるのです、クラスエクステンションには。

そしてカテゴリ部分のメソッドは、
いつものように

    NSString *str = [self returnString];  //カテゴリ(addFunction)から呼び出したメソッド

で呼び出す事ができます。

いいなと思ったら応援しよう!