2016-05-03 8 views
0

コールバックブロックプロパティを持つクラスRequestがあります。RequestCallbackと呼びます。2つのブロックの共通インターフェイスを参照するプロパティ

要求自体は使用すべきではありませんが、2つのサブクラスがあります。 APIRequestおよびHttpRequest。 (はい、この場合は違いがあります)。

APIRequestHttpRequestのコールバックブロックが異なる場合は、APIRequestCallbackHttpRequestCallbackとコールすることができます。

ブロック定義:

typedef void (^HttpRequestCallback)(HttpResponse *); 
typedef void (^APIRequestCallback)(APIResponse *); 

私は私の要求クラスがどちらかAPIRequestCallbackまたはHttpRequestCallbackタイプのものとすることができる1つのCallbackプロパティを持ってみましょうする方法を発見していません。

私はこれを行う方法を考えることができますが、私はそれを暗示する何も見ていません。例としては、idとして私のコールバックオブジェクトを格納APIRequestCallbackHttpRequestCallbackが延長まかせだろう定義されRequestCallbackなど

// Can be either HttpRequestCallback or APIRequestCallback 
@property (copy) RequestCallback callback; 
// or 
@property (strong) id callback; 
// or 
@property (strong) id <RequestCallback> callback; 

いくつかの熟練した客観C開発者はこれに対する解決策を持っていますか?

答えて

0

私は今、私を喜ばせる実用的な解決策を見つけました。誰かが分かっているなら、私に教育してください。

typedef void (^RequestCallback)(id); 

そして、このようなプロパティを使用しています:

Requestクラスは、次のブロックのtypedefを使用しています

@property (copy) RequestCallback callback; 

IDタイプがAPIResponseオブジェクトとHttpResponseオブジェクトを区別しないので、これは動作します。 Objective Cの新しいGenerics構文を使用して、タイプをResponseの__covariantにすることができますが、動作させることができませんでした。