说我有一个界面
// Car.h
@interface Car
@property ( readonly) NSInteger rpm
@end
我希望所有这些用户以只读方式访问
在我的代码专用且不向用户公开的其他区域中,我想操纵rpm
说
// EngineFeedback.h
@interface EngineFeedback
@property(nonatomic , weak ) Car *theCar;
@end
// EngineFeedback.m
-(void) engineRPMReceived:(NSInteger) newRPM
{
theCar.rpm = newRPM;
}
我怎样才能做到这一点(我需要这个可以写的)
我可以定义一个覆盖属性的类扩展
// Car_Internal.h
@interface Car ()
@property(readwrite) NSInteger rpm
@end
能够将其用作
// EngineFeedback.m
#import "Car_Internal.h"
-(void) engineRPMReceived:(NSInteger) newRPM
{
theCar.rpm = newRPM;
}
这不好吗?有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
使用类扩展来覆盖readonly
属性声明是完全正常的。 (事实上,这是readonly
属性的主要目的。)但是,您的Car
类需要提供setRpm:
的实现,以便在运行时工作。
所以鉴于你提供的声明,在Car.m
的某个地方你需要这样的东西:
- (void)setRpm:(NSInteger)newRPM
{
_rpm = newRPM;
}
请注意,如果您愿意,可以在EngineFeedback.m
中声明类扩展名。