覆盖类扩展中的属性属性

时间:2013-08-28 23:12:40

标签: objective-c

说我有一个界面

// 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;
    }

这不好吗?有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

使用类扩展来覆盖readonly属性声明是完全正常的。 (事实上​​,这是readonly属性的主要目的。)但是,您的Car类需要提供setRpm:的实现,以便在运行时工作。

所以鉴于你提供的声明,在Car.m的某个地方你需要这样的东西:

- (void)setRpm:(NSInteger)newRPM
{
     _rpm = newRPM;
}

请注意,如果您愿意,可以在EngineFeedback.m中声明类扩展名。