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


79

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

[one floatValue] + [two floatValue]

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

답변:


143

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

예를 들면 :

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

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

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


1
많은 수학을 수행하려는 숫자 모음을 저장해야하는 경우 추가 할 것입니다. 아마도 적절한 숫자 유형의 C 스타일 배열을 원하십니까?
Kendall Helmstetter Gelner

스칼라를 사용하고 싶을 때 많은 수학을 할 때마다 다형성이 필요하거나 기존 컨테이너에 맞아야 할 때 객체를 사용하려고합니다.
Louis Gerbarg

NSNumber에 대한 적절한 방법은 'numberWithFloat :'입니다. 아마도 이것은 응답 이후에 변경되었을 것입니다.
Nick

맞습니다. getter는 floatValue이므로 습관적으로 두 위치에 입력하지만 stackoverflow는 나에게 컴파일 오류를주지 않습니다. 수정 됨
Louis Gerbarg

2
@clopez :“박사님, 이럴 때 아파요.” NSNumber는 산술이 아닌 컨테이너와 함께 사용하기위한 박스형입니다. 산술을하는 경우 산술 유형을 사용합니다.
Stephen Canon

49

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

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

...

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

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


"모든 새 []를 삭제 []와 페어링하는 것이 매우 지루합니다."라는 의미에 대해 자세히 설명해 주시겠습니까?
jpswain

이렇게합시다. c에서는 포인터를 전혀 사용하지 마십시오. objective-c의 요점은 걱정할 필요가없는 C 위에 레이어를 배치하는 것입니다. C는 직접 사용되는 언어가 아닙니다. 먼저 "관리"해야하는 것입니다.
user4951

두 개의 NSDecimalNumbers를 추가 한 후 NSDecimalNumber결과를 다시 변환하는 방법 은 NSNumber무엇입니까? (이 질문은 두 가지의 추가에 관한 NSNumber두 개의 추가하지, S NSDecimalNumber들.)
ohho

어쨌든 벡터를 가질 때 왜 C 배열을 사용합니까?
Jake Long

1
NSDecimalNumber를 다시 NSNumber로 변환하려는 이유는 무엇입니까? NSDecimalNumber은 입니다 의 NSNumber :@interface NSDecimalNumber : NSNumber
스티븐 피셔

12

당신이 사용할 수있는

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

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

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

"@"기호의 이유는 무엇입니까? 나는 이것이이 맥락에서 무엇을하는지 이해하지 못한다.
Mike Meyers

아. 이제 보겠습니다 .... 여기에 설명 된대로 NSNumber 리터럴입니다. stackoverflow.com/a/11120371/35723
Mike Meyers

예, @mikemeyers는 문자 그대로의 같은 랩 프리미티브 intlong또는 큰 동생 typedef'편 NSIntegerNSNumber 객체 .
nemesis 2014 년

integerValue잘립니다 float. 이 답변은 어떻게 찬성 할 수 있습니까?
ohho 2014-04-08

@ohho 이것은 간단한 예였습니다. integerValue숫자의 소수 부분을 보존하려면 왜 세상에서 사용 합니까?
nemesis 2014

6

현재 최다 투표 답변 은 진단하기 어려운 버그와 부동 소수점 사용으로 인한 정밀도 손실로 이어질 것입니다. 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)

0

왜 사용하지 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]);
 }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.