假设我有一个名为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
没有。
那么,如何使用变量名访问我的浮点数?我肯定答案必须简单,但似乎我的想法是寻找复杂的东西(显然不起作用),所以我在寻求帮助:)
非常感谢您的帮助
答案 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];