1

温度を使用するコードを書いています。そこで、使用されているスケール (C/F) と値を保持するクラスが必要でした。クラスを不変にしました (実装クラスのカテゴリを使用して)。コンバーターが欲しかった。Java では通常、静的メソッドを実行して新しいインスタンスを返すようにしますが、+ メソッドはクラス メソッドであり、インスタンス プロパティにアクセスできないため、OC ではそれができません。

そこで、現在の Temperature インスタンスと変換先のスケールを取得する 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

バッキング値をケルビンまたは C で保存し、settersand getterssetKValue: setFValue:andkValueを使用し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 に答える