2

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

有一些解决方案告诉我使用 [NSNumber numberWithFloat: ] 但是它弄乱了我的浮点值。我在测试浮点值之前和之后,事先我得到了诸如 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

4

5 回答 5

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];

}

希望这可以帮助

于 2013-07-13T00:29:25.383 回答
0

正如其他人所说,您在尝试使用NSNumbers 时犯了一些错误,最好让我们查看该代码。

我运行了以下内容:

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
于 2013-07-13T00:46:12.577 回答
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];
    }
}
于 2013-07-14T20:33:16.947 回答
0

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

谢谢大家的帮助。

于 2013-07-13T01:09:33.177 回答
0
[[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject:[NSNumber numberWithFloat:dt]];

调用具有浮点参数的选择器。将 update: 参数更改为 NSNumber 并在其中调用 NSNumber 上的 floatValue

在你的游戏对象数组上做一个 for-in 循环可能比所有这些 performSelector 和 NSNumber 业务更好。在循环中直接调用更新 netheid。

于 2013-07-13T01:14:18.073 回答