うーん、これはスパゲッティコードと呼ばれるものです。
View Controller が実装できるエンジン プロジェクトでプロトコルを定義してid<Protocol>
から、 をエンジンに渡す方がよいでしょう。これにより、2 つのプロジェクト間に強力な言語 (API) を定義しながら、2 つのプロジェクト間に抽象化が作成されます。エンジン プロジェクトを複数のアプリで使用したいとおっしゃいましたが、これが最善の解決策です。
エンジン プロジェクト:
@protocol MyAPIProtocol
@required
//Define here the actions you want to perform/get from the data source.
- (CGFloat)floatValue;
- (UITextView*)textView;
- (void)displayAlertWithMessage:(NSString*)message;
@end
これで、Rocket クラスには次のように定義されたプロパティが必要です。
@property (nonatomic, weak) id<MyAPIProtocol> dataSource; //Whatever name you need, of course
このエンジン プロジェクトを使用するアプリでは、次のようになります。
#import "MyAPIProtocol.h"
@interface MainViewController () <MyAPIProtocol>
@end
@implementation MainViewController
...
//Implement the protocol
- (CGFloat)floatValue
{
return 123.0f;
}
- (UITextView*)textView
{
return self.textView;
}
- (void)displayAlertWithMessage:(NSString*)message
{
//...
}
@end
その結果、エンジン プロジェクトは自己完結型であり、 の実装を知る必要はありませんMainViewController
。dataSource
すべてのニーズを満たすことができるプロパティがあることを知っているだけです。
MainViewController でエンジン オブジェクトの準備ができたら、次のようにデータ ソースを設定する必要があります。
self.engine.dataSource = self;