Objective-C访问具有变量名称的浮点数

时间:2012-05-13 12:40:43

标签: objective-c

假设我有一个名为NSArray myArray的{​​{1}} NSString@"a0"@"a1"

然后在快速枚举中,我循环到我的数组中,根据NSStrings构建属性。我在访问这些属性时遇到了问题。

我正在尝试这样的事情:

@"a2"

我知道我的代码错了,但我不知道如何让它工作。 我的问题是lowSel和highSel是返回@property (nonatomic) float a0propertyLow; @property (nonatomic) float a0propertyHigh; @property (nonatomic) float a1propertyLow; @property (nonatomic) float a1propertyHigh; .. .. etc. for (NSString *aPos in myArray) { NSString *low = [NSString stringWithFormat:@"%@propertyLow",aPos]; NSString *high = [NSString stringWithFormat:@"%@propertyHigh",aPos]; SEL lowSel = NSSelectorFromString(low); SEL highSel = NSSelectorFromString(high); if ([self respondsToSelector:lowSel]&&[self respondsToSelector:highSel]) { id sumPartOne = [self performSelector:lowSel]; id sumPartTwo = [self performSelector:highSel]; float bla = (float)sumPartOne + (float)sumPartTwo; } } 的getter,但执行选择器方法返回float,这对于一个对象是可以的,但对id没有。

那么,如何使用变量名访问我的浮点数?我肯定答案必须简单,但似乎我的想法是寻找复杂的东西(显然不起作用),所以我在寻求帮助:)

非常感谢您的帮助

3 个答案:

答案 0 :(得分:3)

您不能使用performSelector:来调用返回标量值的方法。 performSelector:的文档明确说明了您必须做的事情:

  

对于返回除对象以外的任何内容的方法,请使用NSInvocation

设置NSInvocation稍微复杂一些,但在参数和返回类型方面更灵活。

在您的情况下,可能更容易使用键值编码:

[self valueForKey:low];

将返回类型考虑在内,并自动将float包裹在NSNumber中。

答案 1 :(得分:1)

如果您确实需要使用这些getter方法,可以将属性更改为double并使用objc_msgSend_fpret():

#include <objc/runtime.h>
#include <objc/message.h>

double arg0 = objc_msgSend_fpret(self, lowSel);

如果你可以避免使用getter(我知道,这不是一个好习惯,但无论如何,它确实可以使用以下方法),并直接使用实例变量:

void *object_getIvarPtr(id obj, const char *name)
{
    if (!obj || !name)
    {
        return NULL;
    }

    Ivar ivar = object_getInstanceVariable(obj, name, NULL);

    if (!ivar)
    {
        return NULL;
    }

    return ((char *)obj + ivar_getOffset(ivar));
}

float arg0 = *(float *)object_getIvarPtr(self, [lowSel UTF8String]);

希望这有帮助。

答案 2 :(得分:-1)

您可以做的一种方法是在运行时将浮动转换为对象,例如: -

NSString *str=[NSSTring stringWithFormat:@"%f",yourFloatValue];

然后你可以使用

来检索它
[str floatValue];