忘備録

日々の調べ物をまとめる。アウトプットする。基本自分用。

【Objective-C】protectedなproperty

protectedなpropertyの実現の仕方を現場のエレガントなコードを書く方に教えていただきました。
カテゴリーを利用すると実現できるんですね。

まず親クラス。

SuperHoge.m

#import <Foundation/Foundation.h>

@interface SuperHoge : NSObject

@end

SuperHoge.m

#import "SuperHoge.h"

@interface SuperHoge ()
/** protectedにしたいプロパティ */
@property NSString *protectedProp;
@end

@implementation SuperHoge

@end

クラス拡張にてプロパティを定義するのがポイント。

んで、親クラスのカテゴリ

SuperHoge+Private.h

#import "SuperHoge.h"

@interface SuperHoge (Private)
/** protectedにしたいプロパティ */
@property NSString *protectedProp;
@end

SuperHogeのクラス拡張にて定義したプロパティと同じものを定義するのがポイント。

カテゴリに関しては実装することがないので、実装ファイルはなくていいです。

次に子クラス

SubHoge.h

#import "SuperHoge+Private.h"

@interface SubHoge : SuperHoge

@end

子クラスでは親クラスのカテゴリをインポートする。

イニシャライザーでprotectedPropにアクセスしてみる。

SubHoge.m

#import "SubHoge.h"

@implementation SubHoge

- (id)init {
    
    if (self = [super init]) {
        // _protectedProp = @"init Hogehoge" のようにインスタンス変数に直接アクセスはできない。
        self.protectedProp = @"init Hogehoge";
        NSLog(@"%@", self.protectedProp);
    }
    
    return self;
}

@end

他クラスからの利用

#import "SubHoge.h"

/*-------------------中略----------------------------------*/

    SubHoge *hoge = [[SubHoge alloc] init];
    hoge.protectedProp = @"update protectedProp";
    NSLog(@"%@", hoge.protectedProp);

ログ出力

init protectedProp
update protectedProp