Objective-C で次のことをしなければならない理由がわかりません。一般的な意味での理由を発見することに興味があります (つまり、言語/コンパイラが私にこのようにすることを強制する理由)。
私はプロトコルを持っています:
// (file: MyObserver.h)
@class TheObserved;
@protocol MyObserver <NSObject>
- (void)itWasObserved:(TheObserved *)observedInstance;
@end
プロトコルを (周期的に) 使用するインターフェース「TheObserved」があります。
// (file: TheObserved.h)
@protocol MyObserver;
@interface TheObserved : NSObject
@property id <MyObserver> myObserver;
- (void)lookAtThisData:(NSString *)someData withObserver:(id <MyObserver>)observer;
@end
つまり、ご覧のとおり、プロトコルにはインターフェイスのインスタンスを取るメッセージがあり、インターフェイスにはプロトコルを実装するインスタンスを取るメソッドがあります。
インターフェイスの私の実装では:
// (file: TheObserved.m)
#import "TheObserved.h"
#import "MyViewController.h" // <-- note this import
@implementation TheObserved
@synthesize myObserver;
- (void)lookAtThisData:(NSString *)someData withObserver:(id <MyObserver>)observer {
self.myObserver = observer;
// some asynchronous looking at the data is done here.
}
- (void)asynchCallback:(NSData *) data {
// check if the data is as we expect, if so ..
[self.myObserver itWasObserver: self]
}
@end
MyViewController.h はプロトコルを実装します。
// (file: MyViewController.h)
#import <UIKit/UIKit.h>
#import "OWLMorphDataObserver.h"
@interface MyViewController : UITableViewController <MyObserver>
@end
そしてその実装では:
// (file: MyViewController.m)
#import "TheObserved.h"
@interface MyViewController () {
@property TheObserved *observed;
@end
@implementation MyViewController
@synthesize observed;
- (void) aMethod:(NSString *)dataString {
[self.observed lookAtThisData:dataString withObserver:self]
}
@end
私の質問は、具体的な実装が Observed クラスで明示的に参照されていないにもかかわらず、Observed クラスで @protocol を実装する "MyViewController.h" を #import する必要があるのはなぜですか? そうしないと、コンパイル エラーが発生します。
no known instance method for selector 'lookAtThisData:'
ここでの問題は、もちろん、複数の異なるビュー コントローラーにこのプロトコルを実装させたいということです。では、なぜそれらの 1 つをインポートしてコンパイルする必要があるのでしょうか。
使用したいクラスにプロトコルの具体的な実装をインポートせずに、このコードを構造化して目的の効果を得る別の方法はありますか?