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

Property referring to a common interface for two Blocks

我有一个 class Request 应该有一个回调块 属性,我们称它为 RequestCallback

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

APIRequestHttpRequest 的回调块不同,我们称它们为 APIRequestCallbackHttpRequestCallback

块定义:

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

我还没有找到任何方法让我的请求 class 有一个回调 属性,它可以是 APIRequestCallbackHttpRequestCallback 类型。

我能想到可以做到这一点的方法,但我还没有看到任何暗示。示例将我的回调对象存储为 id,让 APIRequestCallbackHttpRequestCallback 扩展定义的 RequestCallback

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

有技术高超的 objective C 开发人员对此有解决方案吗?

我找到了一个目前令我满意的可行解决方案。有知道的请赐教

Request class 使用以下块类型定义:

typedef void (^RequestCallback)(id);

并像这样使用 属性:

@property (copy) RequestCallback callback;

这是有效的,因为 id 类型不区分 APIResponse 对象和 HttpResponse 对象。我很想使用 Objective C 的新泛型语法来强制类型成为 Response 的 __covariant 但我无法让它工作。