読者です 読者をやめる 読者になる 読者になる

忘備録

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

【Objective-C】protectedなproperty

Objective-C

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