[objective-c] 두 개의 NSNumber 객체를 추가하는 방법은 무엇입니까?

이제 이것은 쉬울 것입니다. 그러나 어떻게 2를 합할 수 NSNumber있습니까? 처럼:

[one floatValue] + [two floatValue]

아니면 더 나은 방법이 있습니까?



답변

더 좋은 방법은 없지만 피할 수 있다면 실제로는하지 말아야합니다. NSNumber스칼라 숫자에 대한 래퍼로 존재하므로 컬렉션에 저장하고 다른 것과 다형성으로 전달할 수 있습니다.NSObjects . 그들은 실제 수학에서 숫자를 저장하는 데 실제로 사용되지 않습니다. 그것들에 대해 수학을한다면 그것은 단지 스칼라에 대한 연산을 수행하는 것보다 훨씬 느리기 때문에 아마도 그것을위한 편리한 방법이 없을 것입니다.

예를 들면 :

NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];

메시지 디스패치에 대해 최소 21 개의 명령어를 불고 있으며, 1 개의 명령어 값에 해당하는 수학을 수행하기 위해 메소드가 값 (아마도 수백 개)을 풀고 리 박스하는 데 필요한 코드가 얼마든지 있습니다.

따라서 딕셔너리에 숫자를 저장해야하는 경우를 사용하고 NSNumber, 숫자 나 문자열이 될 수있는 것을 함수에 전달해야하는 경우를 사용하십시오 NSNumber.


답변

NSDecimalNumber ( NSNumber의 하위 클래스 )에는 원하는 모든 기능이 있습니다.

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:

컴퓨팅 성능이 중요하다면 C ++ 배열 std :: vector 등으로 변환하십시오.

이제 저는 더 이상 C-Array를 사용하지 않습니다. 잘못된 인덱스 나 포인터를 사용하면 충돌하기가 너무 쉽습니다. 그리고 모든 새 []를 delete []와 페어링하는 것은 매우 지루합니다.


답변

당신이 사용할 수있는

NSNumber *sum = @([first integerValue] + [second integerValue]);

편집 : ohho가 관찰 한대로이 예제는 NSNumber정수 값을 보유 하는 두 인스턴스 를 더하기위한 것 입니다. 두 개를 더하고 싶다면NSNumber부동 소수점 값을 포함 개의을 더하려면 다음을 수행해야합니다.

NSNumber *sum = @([first floatValue] + [second floatValue]);


답변

현재 최다 투표 답변 은 진단하기 어려운 버그와 부동 소수점 사용으로 인한 정밀도 손실로 이어질 것입니다. NSNumber 값에 대해 숫자 연산을 수행하는 경우 먼저 NSDecimalNumber로 변환하고 대신 해당 객체로 연산을 수행해야합니다.

로부터 문서 :

NSNumber의 변경 불가능한 하위 클래스 인 NSDecimalNumber는 10 진수 산술을 수행하기위한 객체 지향 래퍼를 제공합니다. 인스턴스는 가수 x 10 ^ 지수로 표현할 수있는 모든 숫자를 나타낼 수 있습니다. 여기서 가수는 최대 38 자리의 십진 정수이고 지수는 –128에서 127 사이의 정수입니다.

따라서 다음을 통해 NSNumber 인스턴스를 NSDecimalNumbers로 변환해야합니다. [NSNumber decimalValue] 하고 원하는 산술을 수행 한 다음 완료되면 NSNumber에 다시 할당해야합니다.

Objective-C에서 :

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]

Swift 3 :

let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)


답변

왜 사용하지 NSxEpression않습니까?

NSNumber *x = @(4.5), *y = @(-2);

NSExpression *ex = [NSExpression expressionWithFormat:@"(%@ + %@)", x, y];
NSNumber *result = [ex expressionValueWithObject:nil context:nil];

NSLog(@"%@",result); // will print out "2.5"

다음과 같이 다른 인수로 평가하는 데 재사용 할 수있는 NSExpression을 빌드 할 수도 있습니다.

NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);

예를 들어, 매번 다른 “Y”값으로 동일한 구문 분석 된 표현식을 평가하는 루프를 반복 할 수 있습니다.

 for (float f=20; f<30; f+=2.0) {
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
    NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
 }


답변

Swift에서는 Bolt_Swift 라이브러리 https://github.com/williamFalcon/Bolt_Swift를 사용하여이 기능을 얻을 수 있습니다 .

예:

  var num1 = NSNumber(integer: 20)
  var num2 = NSNumber(integer: 25)
  print(num1+num2) //prints 45


답변