在Objective C中使用init作为复制转换器?

时间:2013-03-18 03:54:15

标签: objective-c

我正在编写一些使用Temperatures的代码。所以我想要一个能够保持使用比例(C / F)和值的类。我使类不可变(通过在实现类中使用类别)。我想要一个转换器。在Java中,我们通常会执行一个静态方法并让它返回一个新实例,但是你不能在O-C中这样做,因为+方法是类方法,并且不能访问实例属性。

所以我做了一个init方法,它接受当前的Temperature实例和我们希望它转换为的比例。完成C ++很长一段时间后,这就像一个复制构造函数。

这里的问题是,是否有更好的方法或某些东西被视为标准做法。所以为了得到转换你会做:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0];
Temperature *freezingC = [[Temperature alloc]initWith:freezingF andScale:Celsius];

assertThat(freezingC.value, is(@0));

(缩短变量名以限制滚动...)

3 个答案:

答案 0 :(得分:3)

我会将支持值存储为开尔文或C,然后使用settersgetterssetKValue: setFValue:kValuefValue 。因为它们在不同的单位中基本上是相同的值

答案 1 :(得分:2)

为什么不添加一个convertTo:实例方法,该方法在新单元中返回一个新的不可变温度实例?

- (Temperature *)convertTo:(TemperatureScale)scale {
    float newValue = ... // calculate new value
    return [[Temperature alloc] initWithScale:scale andValue:newValue];
}

然后您的代码变为:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0];
Temperature *freezingC = [freezingF convertTo:Celsius];

答案 2 :(得分:0)

根据此处的讨论,另一种选择是:

+(Temperature *)convert:(Temperature *)from toScale:(TemperatureScale)newScale;

会像这样调用:

Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32];
Temperature *freezingC = [Temperature convert:freezingF toScale:Celsius];

这是基于NSNumber类方法示例:numberWithFloat,Int等。