2016-05-03 7 views
0

Ich habe eine Klasse Request, die eine Callback-Block-Eigenschaft haben soll, rufen Sie uns RequestCallback.Eigenschaft verweist auf eine gemeinsame Schnittstelle für zwei Blöcke

Die Anfrage selbst sollte nicht verwendet werden, aber sie hat zwei Unterklassen. APIRequest und HttpRequest. (Ja, in diesem Fall gibt es einen Unterschied).

Die Callback-Blöcke sind unterschiedlich für APIRequest und HttpRequest, nennen wir sie APIRequestCallback und HttpRequestCallback.

Blockdefinitionen:

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

Ich habe keine Möglichkeit zu lassen, meine Anfrage Klasse haben eine Callback-Eigenschaft gefunden, die entweder APIRequestCallback oder HttpRequestCallback Typ sein kann.

Ich kann mir vorstellen, wie dies getan werden kann, aber ich habe nichts gesehen, was es bedeutet. Beispiele hierfür wären meine Rückruf Objekt als id, Vermietung APIRequestCallback und HttpRequestCallback erweitern eine definierte RequestCallback usw.

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

Hat einige qualifizierte Ziel C-Entwickler haben eine Lösung für dieses Problem sein zu speichern?

Antwort

0

Ich habe eine funktionierende Lösung gefunden, die mir jetzt gefällt. Wenn jemand es besser weiß, bitte erziehe mich.

Die Request Klasse verwendet den folgenden Block-typedef:

typedef void (^RequestCallback)(id); 

und verwendet eine Eigenschaft wie folgt:

@property (copy) RequestCallback callback; 

Das funktioniert, weil der ID-Typ nicht zwischen APIResponse Objekten und HttpResponse Objekten unterscheidet . Ich würde gerne die neue Generics-Syntax von Objective C verwenden, um den Typ zu einer __covariante von Response zu zwingen, aber ich konnte es nicht zum Laufen bringen.

Verwandte Themen