1

说我有一个界面

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

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

4

1 回答 1

1

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

因此,鉴于您提供的声明,在某处Car.m您需要这样的东西:

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

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

于 2013-08-28T23:17:57.637 回答