Objective C / oopを学習するための補助として、定期的な体重測定値を保存するiOSアプリを設計しています。さまざまな単位(Kg、Lbなど)で体重を取得できるようにしたいと考えています。体重のインスタンスごとに、正しい単位で体重を返すカスタムゲッターでNSNumberをサブクラス化できますか?おそらく、代わりにNSObjectをサブクラス化する必要がありますか?
3 に答える
正しい単位で重みを返すカスタムゲッターで NSNumber をサブクラス化できますか? おそらく、代わりに単に NSObject をサブクラス化する必要がありますか?
あなたはできる?はい。あなたはすべきですか?いいえ。NSNumber インスタンスは、実際には決して NSNumbers ではありません。NSNumber は、さまざまなサブクラスのディスペンサーとして機能します。つまり、サブクラス化すると、本質的に NSNumber のクラス ディスペンションの側面を再実装することが約束されます (NSArray と NSString についても同じことが言えます)。
サブクラス化を試みるのではなく、NSNumber にカテゴリを記述してみてください。それでも、NSNumber は、操作や数学演算用に設計されたものではありません。数値は基本的に不変の構成要素であるため、コントローラー オブジェクトのどこかにプリミティブを使用して物事を計算するメソッドを作成する方がはるかに優れています。あなたの特定の状況では、 NSNumber は永続化にのみ適しています。
いいえ、まったく使用NSNumber
しないでください。カテゴリを追加することさえしないでください。このクラス (クラスター) は、プリミティブ型をオブジェクトとして格納する必要がある場合などに設計されている場合です。
重みをカプセル化したい場合は、それを行うクラスを記述します (ターミナルで入力されたコード):
@interface Weight : NSObject
@property double kilos:
@property double pounds;
// etc
@end
@implementation Weight
{
double value; // stored in a suitable unit, kg, lb, oz, g, etc.
}
// implement getters and setters converting between unit of property and unit of value
// implement dependent property methods to setting, say, pounds produces a KVO
// notification for both pounds and kilos, etc. E.g.:
+ (NSSet *) keyPathsForValuesAffectingPounds
{
return [NSSet setWithObject:@"kilos"];
}
@end
値を 1 つの単位として設定し、別の単位として読み取り、設定されているすべてのプロパティの KVO 通知を受け取ることができるようになりました。
コンストラクター (例: newWeightWithKilos:
)、場合によっては操作 (例:addWeight:
内部値を追加するだけ) を追加し、 aWeight
が可変か不変かを決定する必要があります。
NSNumber をサブクラス化する必要はなく、代わりに NSObject をサブクラス化し、プロパティを追加して重量を基本単位 (例: kg) で設定し、重量を基本単位で取得して変換値を単位で返すいくつかのメソッドを追加できます。あなたが指定します(lbなど)。