LoginSignup
4
4

More than 5 years have passed since last update.

delegateを共通部分だけ、実装したり、差し込んだり。

Posted at

はじめに

delegateを普通に実装していると、表示部分とイベント部分が一緒に定義されていて、表示は共通で実装したいが、イベントはそれぞれの呼び出し元で実装したいことがあります。
クラスを継承すれば、とりあえずは実装できますが、別のdelegateを定義しなくてはならなくて、スマートではないので、既存のプロトコルを生かした形で実現できる方法をまとめます。

オリジナル

プロトコル

OriginalDelegate.h
@protocol OriginalDelegate : NSObject

- (void)doCommon;

- (void)doPartly;

@end

インターフェース

Original.h

@interface Original : NSObject

@property (nonatomic, weak) id<OriginalDelegate> delegate;

@end

オリジナルを継承した実装

インターフェース

Extend.h

@interface Extend : Original <OriginalDelegate>

@end

実装

Extend.m

@interface Extend () <OriginalDelegate>

// 呼び出し元を設定するdelegateを別名で定義
@property (nonatomic, weak) id<OriginalDelegate> originalDelegate;

@end

@implementation Extend

@synthesize delegate = _delegate;

- (void)init {
    if (self = [super init]) {
        //delegateを共通部分を実装しているインスタンスに設定
        _delegate = self;
    }
}

- (id<OriginalDelegate>)delegate {
    return _delegate;
}

// 呼び出すdelegateを設定
- (void)setDelegate:(id<OriginalDelegate>)delegate {
    self.originalDelegate = delegate;
}

- (void)doCommon {
    // doSomething.
}

- (void)doPartly {
    // 呼び出し元をcall
    // ここにも共通の処理を実装できる
    [self.originalDelegate didPartly];
}

@end

最後に

これで、呼び出し元でオリジナルと同様のインターフェース/プロトコルで実装できます。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4