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

Posted

技术标签:

【中文标题】Objective C - 通过选择器传递浮点数【英文标题】:Objective C - Passing a float through a selector 【发布时间】:2013-07-13 00:24:04 【问题描述】:

我正在尝试使用 '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

【问题讨论】:

你能举出你看到 0.0000000 的例子吗?您应该解决这个问题,因为将浮点数包装在 NSNumber 中是正确的答案。你只是在实现中犯了一些错误。 确实;可以肯定的是,如果您认为自己得到了 0.00000,那么您将得到 floatValuenil 而不是实际数字。 显示update: 的声明。参数类型是什么?它不能是 float 类型,因为您需要将其传递给 NSNumber 这是不可能的,因为 Objective-C doesn't perform autoboxing。您要么必须自己通过其他方法执行此操作,请使用 NSInvocation 或使用描述的方法 here NSNumber 不会“弄乱”你的浮动值,如果你做得对的话。问题是您没有在目标方法中接收 NSNumber,而是试图将指向 NSNumber 的指针解释为浮点数。 【参考方案1】:

您应该将浮点数包装在一个 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];


希望对你有帮助

【讨论】:

更简单:NSNumber *num = @5.5;NSNumber *num = @(someFloatVariable);【参考方案2】:

正如其他人所说,您在尝试使用 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

【讨论】:

【参考方案3】:

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

感谢大家的帮助。

【讨论】:

您应该在这里接受最佳答案。这样做会让人们在未来更愿意帮助你。您有许多未选答案的未决问题。【参考方案4】:
[[self gameObjects] makeObjectsPerformSelector:@selector(update:) withObject:[NSNumber numberWithFloat:dt]];

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

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

【讨论】:

调用具有浮点参数的选择器。 - 不,该代码调用具有NSNumber 参数的选择器。 是的,OP 的update: 选择器采用float。但是您的评论似乎是指您答案中的代码行。该行代码尝试调用需要采用NSNumber 参数的选择器。这就是我评论的重点。您的答案似乎声称您的答案中的代码行正在调用一个带有 float 参数的选择器。 忘记复制粘贴其余部分。另一位虽然仍然调用该选择器。将对象传递给它可能确实会给你一个零浮动。【参考方案5】:

您正在寻找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];
    

【讨论】:

以上是关于Objective C - 通过选择器传递浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C浮点数转化整数(向上取整向下取整)

在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果

在传递给 SVM 分类器之前将字符串数据转换为浮点数

在 Objective-C 中将货币字符串转换为浮点数

Unity VR开发结合VRTK4.0:将浮点数从交互器传递到可交互对象

表单传递字符串而不是浮点数