我希望在公共标头中公开具有泛型类型的属性,然后在私有标头中将其类型更改为更具体的类型。我使用的是Clang,但虽然我能够改变其读/写属性,但它并不接受不同的类型。到目前为止,这是我尝试过的:
普通客户端会导入BKSystem.h
:
@interface BKSystem : NSObject
@property(nonatomic, readonly) id<XYZWorker> worker;
@end
虽然测试客户端可以通过导入BKSystem+Testing.h
来访问内部:
#import "BKSystem.h"
@interface BKConfigurableWorker : NSObject<XYZWorker>
@property(nonatomic) BKConfiguration *config;
@end
#pragma mark -
@interface BKSystem ()
// Attempts to change worker to be writable and with a more specific type.
@property(nonatomic, readwrite) BKConfigurableWorker *worker;
@end
但在测试客户端上,这就是我得到的:
#import "BKSystem+Testing.h"
BKSystem *system = [[BKSystem alloc] init];
// I am able to write to this property.
system.worker = [[BKConfigurableWorker alloc] init];
// ERROR: Property 'config' not found on object of type 'id<XYZWorker>'
system.worker.config = [[BKConfiguration alloc] init];
答案 0 :(得分:0)
要完成您尝试做的事情,我会使用BKWorker
作为子类而不是协议。请参阅下面的示例头文件:
@interface BKConfiguration : NSObject
@end
@interface BKWorker : NSObject
@property (nonatomic, strong, readonly) BKConfiguration *config;
@end
@interface BKConfigurableWorker : BKWorker
@property (nonatomic, strong, readwrite) BKConfiguration *config;
@end
请注意,在可配置工作器中再次声明了相同的属性,但是readwrite
而不是readonly
。
在实现中使用时会产生以下结果:
注意可配置工作者如何写入,但标准工作者不能写入。
希望这有帮助。