2013-07-13 2 views
2

'withObject :'를 사용하여 선택기를 통해 float를 전달하려고하지만 객체 만 허용합니다.목표 C - 선택기를 통해 float 전달

[NSNumber numberWithFloat :]를 사용하는 솔루션이 있지만 내 플로트 값이 엉망입니다. 나는 이전과 부동의 값의 테스트 후를하고있는 중이 야, 그리고 이후 그들은 모두 0.0000000

[[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject: <what to put here>]]; 

덕분에 미리 반면 사전에 나는, 같은 0.0034324 같은 번호를 얻을!

EDIT 여기 *

는 .... 컨텍스트

-(void) tick:(float)dt{ 
    NSLog(@"%f",dt) 
    [[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject:[NSNumber numberWithFloat:dt]]; 

} 

상기로부터 출력 된 번호 0

그러나 선택 방법에서 NOT이다

- (void)update:(float)dt{ 

    NSLog(@"%f",dt); 

} 

출력은 0

01입니다.
+2

당신이 0.0000000보고 된 예를 게재 할 수 있습니까? NSNumber에서 float을 래핑하는 것이 올바른 대답이기 때문에이를 수정해야합니다. 당신은 방금 그것의 구현에 약간의 실수를했습니다. –

+0

실제로; 당신이 0.00000을 얻고 있다고 생각한다면 실제 숫자가 아닌'nil'의'floatValue'를 취하는 것이 안전한 내기입니다. – Tommy

+0

'update :'에 대한 선언을 보여줍니다. 매개 변수 유형은 무엇입니까? 'NSNumber'를 전달해야하기 때문에'float' 유형이 될 수 없습니다. – rmaddy

답변

4

NSNumber에 float을 래핑해야합니다.

NSNumber * num = [NSNumber numberWithFloat:5.5]; 

편집 : rmaddy으로 지적하고있다, 여기에 사용하는 몇 가지 다른 방법이 있습니다의 NSNumber 영업 이익 *

NSNumber * num = @5.5f; 
float someFloat = 5.5f; 
NSNumber * num1 = @(someFloat); 

, 우리는 해부 도움이되는 코드의 자세한 내용을 볼 필요가 실제 문제

업데이트는 새로운 상황에 대응하는

대상 메서드에서 예상 인수로 a (float)를 사용하도록 지정합니다. 함수에 전달할 변수의 유형을 인식하는 것이 중요합니다. 당신의 makeObjectsPerformSelector 메쏘드의 마지막 인자는 withObject로 시작합니다. 이는 프리미티브 float가 아니라 객체를 전달하고 있음을 나타냅니다. 그래서 당신과 같은의 NSNumber에 전달하려는 플로트 포장 : 다른 사람에 의해 언급 한 바와 같이

NSNumber * numToPass = @(floatToWrap); 
[[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject:numToPass]]; 

- (void)update:(NSNumber *)dt { 

    NSLog(@"%f",dt.floatValue); // or [dt floatValue]; 

} 

희망이

+2

더 쉽게 : 'NSNumber * num = @ 5.5;'또는 'NSNumber * num = @ (someFloatVariable);'. – rmaddy

0

도움을, 당신은 NSNumber의를 사용하도록 시도에 약간의 실수를했는데 아마 것 그 코드를 보도록 요청하는 것이 좋습니다.

float value = 0.0034324f; 
NSNumber *valueObject = @(value); 

NSLog(@"%0.7f, %@", value, valueObject); 

출력했다 :

나는 다음을 실행

2013-07-12 17:45:07.948 Untitled[4950:707] 0.0034324, 0.0034324 
0

문제가 여전히 float를했다으로 내가의 NSNumber를 수용하는 나의 선택 방법을 변경하지 않은 것이 었습니다 해당 매개 변수 유형.

도움을 주신 모든 분들께 감사드립니다.

+0

여기에서 가장 좋은 대답을 받아 들여야합니다. 그렇게하면 사람들은 앞으로 더 많은 사람들을 도와 줄 것입니다. 선택한 답변이없는 열린 질문이 많습니다. –

0
[[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject:[NSNumber numberWithFloat:dt]]; 

float 인수가있는 선택기를 호출합니다. 장 업데이트 :의 NSNumber에 인수와가의 NSNumber

을하는 FloatValue 전화 내부에 아마 더 잘 할 단지에 대한-의 모든 performSelector과의 NSNumber 사업에 비해 게임 오브젝트의 배열에 루프. 루프에서 직접 netheid를 호출하십시오.

+0

* float 인수가있는 selector를 호출합니다. * - 아니요, 해당 코드는 NSNumber 인수가있는 selector를 호출합니다. – rmaddy

+0

- (void) update : (float) dt는 내가 본 셀렉터입니다. – uchuugaka

+0

예, OP의'update :'선택자는'float'을 취합니다. 그러나 귀하의 의견은 답안의 코드 줄을 나타내는 것으로 보입니다. 그 코드 행은'NSNumber' 인수를 취해야하는 선택자를 호출하려고 시도합니다. 그것이 내 의견의 핵심입니다. 당신의 대답은 당신의 대답에있는 코드 줄이'float' 인수를 취하는 선택자를 호출하고 있다고 주장하는 것 같습니다. – rmaddy

0

찾고 계신 분은 NSInvocation입니다. 이 쓸 수있는 가장 적절한 것은 아니지만, 그것은 정확히 요구하는 일 :

- (void)update:(CGFloat)value 
{ 
    XCTAssertEqualsWithAccuracy(value, 2.1, 0.001, @""); 
} 

- (void)testNSInvocationOverArrayWithFloatArgument 
{ 
    CGFloat value = 2.1; 
    NSArray *gameObjects = @[ self ]; 

    for (id object in gameObjects) { 
     NSMethodSignature *signature = [object methodSignatureForSelector:@selector(update:)]; 
     NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 

     [invocation setTarget:object]; 
     [invocation setSelector:@selector(update:)]; 
     [invocation setArgument:&value atIndex:2]; 

     [invocation invoke]; 
    } 
}