我正在尝试使用'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
答案 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];
}
}