属性指的是两个块的公共接口

时间:2016-05-03 11:11:01

标签: objective-c-blocks

我有一个应该有Callback-block属性的类Request,让我们调用它RequestCallback

不应使用请求本身,但它有两个子类。 APIRequestHttpRequest。 (是的,在这种情况下有区别)。

APIRequestHttpRequest的回调功能块不同,我们称之为APIRequestCallbackHttpRequestCallback

块定义:

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

我还没有找到任何方法让我的Request类有一个Callback属性,可以是APIRequestCallbackHttpRequestCallback类型。

我可以想办法做到这一点,但我没有看到任何暗示它的东西。示例是将我的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开发人员是否有解决方案?

1 个答案:

答案 0 :(得分:0)

我找到了一个令我满意的工作解决方案。如果有人知道的更好,请教育我。

Request类使用以下Block typedef:

typedef void (^RequestCallback)(id);

使用这样的属性:

@property (copy) RequestCallback callback;

这是有效的,因为id类型不区分APIResponse个对象和HttpResponse个对象。我很乐意使用Objective C的新Generics语法来强制该类型成为Response的__covariant但我无法使其工作。