21

OK、これは今日のばかげた質問かもしれませんが、次のようなクラスがあるとします:

NSDecimalNumber *numOne   = [NSDecimalNumber numberWithFloat:1.0];
NSDecimalNumber *numTwo   = [NSDecimalNumber numberWithFloat:2.0];
NSDecimalNumber *numThree = [NSDecimalNumber numberWithFloat:3.0];

これらの数値を加算する関数を使用できないのはなぜですか:

- (NSDecimalNumber *)addThem {
    return (self.numOne + self.numTwo + self.numThree);
}

ばかであることを事前にお詫び申し上げます。ありがとうございます。

4

5 に答える 5

22

CにもObjective Cにも演算子のオーバーロードがないため、やりたいことができません。代わりに、次のように書く必要があります。

- (NSDecimalNumber *)addThem {
    return [self.numOne decimalNumberByAdding:
        [self.numTwo decimalNumberByAdding:self.numThree]];
}

Objective-C++ で汚い遊びをしたい (ソースの名前を .mm に変更する) 場合は、次のように記述できます。

NSDecimalNumber *operator + (NSDecimalNumber *a, NSDecimalNumber *b) {
    return [a decimalNumberByAdding:b];
}

これで、次のように記述できます。

- (NSDecimalNumber *)addThem {
    return self.numOne + self.numTwo + self.numThree;
}

C++ に行こう!

于 2010-03-15T18:20:59.560 に答える
10

NSDecimalNumber は、インスタンス化されると、数値を含むオブジェクトを生成する Objective C クラスです。メソッドのみを介してオブジェクト (および一般的なオブジェクト) にアクセスします。Objective C には、オブジェクトに対して算術演算を直接表現する方法がないため、次の 3 つの呼び出しのいずれかを行う必要があります。

  • -[NSDecimalNumber doubleValue]、数値を追加する前にオブジェクトから数値を抽出します。リンク
  • -[NSDecimalNumber decimalNumberByAdding] は、追加のオブジェクトを作成しますが、これは必要以上になる場合があります。リンク
  • NSDecimalAdd も追加のオブジェクトを作成しますが、これは必要以上のものになる可能性があります。リンク
于 2010-03-15T18:23:37.930 に答える
6

NSDecimalAdd関数 (および NSDecimalMultiply、NSDecimalDivide、NSDecimalSubtract) を参照してください。

于 2010-03-15T18:21:30.703 に答える
2

あなたはできる:

- (NSDecimalNumber *)addThem {
    return [[self.numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree];
}

あなたの例の問題は、ビットレベルで実際に self.numOne がオブジェクトへのポインタであることです。したがって、関数は合計ではなく、ランダムなメモリ位置を返します。

Objective-C が C++ スタイルの演算子のオーバーロードをサポートしていれば、誰かが+へのエイリアスとして 2 つの NSDecimalNumber オブジェクトにいつ適用されるかを定義できますdecimalNumberByAdding:。しかし、そうではありません。

于 2010-03-15T18:21:49.157 に答える
2
[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]
于 2010-03-15T18:19:31.407 に答える