1

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

所以我做了一个 init 方法,它采用当前的温度实例和我们希望它转换成的比例。做C++很久了,这就像是一个拷贝构造函数。

这里的问题是是否有更好的方法或被认为是标准做法的东西。因此,要获得转换,您将执行以下操作:

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

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

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

4

3 回答 3

3

我会将支持值存储在 Kelvin 或 C 中,然后使用settersand getters, setKValue: setFValue:and kValue, fValue。因为它们在不同的单位中基本上是相同的值

于 2013-03-18T03:59:09.833 回答
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];
于 2013-03-18T04:06:54.863 回答
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 等。

于 2013-03-18T04:49:35.137 回答