Objective C - 通过选择器传递一个浮点数

时间:2013-07-13 00:24:05

标签: objective-c

我正在尝试使用'withObject:'通过选择器传递一个浮点数,但是它只接受对象。

有些解决方案告诉我使用[NSNumber numberWithFloat:]然而它正在弄乱我的浮点值。我在测试float的值之前和之后做了一个,之前我得到的数字是0.0034324,而之后它们都是0.0000000

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

提前致谢!

修改*

这是上下文

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

}

从上面输出的数字不是0

但是从选择器方法....

- (void)update:(float)dt{

    NSLog(@"%f",dt);

}

输出为0

5 个答案:

答案 0 :(得分:4)

你应该将浮动包装在NSNumber中。

NSNumber * num = [NSNumber numberWithFloat:5.5];

修改 正如rmaddy指出的,这里有一些其他方法可以使用NSNumber *

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

到OP, 我们需要查看更多代码以帮助剖析实际问题

更新以响应新上下文

在目标方法中,您指定期望(float)作为预期参数。重要的是要认识到要传递给函数的变量类型。请注意,makeObjectsPerformSelector方法的最后一个参数的前缀为withObject。这表示您正在传递一个对象,而不是一个原始浮点数。因此,请将要传递的浮动包装在NSNumber中:

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

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

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

}

希望这有帮助

答案 1 :(得分: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

答案 2 :(得分:0)

问题是我没有更改我选择的方法以容纳NSNumber,因为它仍然有一个浮点作为其参数类型。

感谢大家的帮助。

答案 3 :(得分:0)

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

调用具有float参数的选择器。 Chang更新:NSNumber的参数,并在其内部调用NSNumber上的floatValue

对于你的gameObjects数组执行for-in循环可能比所有这些performSelector和NSNumber业务更好。在循环中直接调用更新netheid。

答案 4 :(得分: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];
    }
}