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,那么您将得到floatValue
的 nil
而不是实际数字。
显示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】:
正如其他人所说,您在尝试使用 NSNumber
s 时犯了一些错误,最好让我们查看该代码。
我运行了以下内容:
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 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果