在Objective-C中,是否可以通过字符串名称检索结构属性?
我有一个对象,它的属性是如下所示的结构:在Objective-C中,是否可以通过字符串名称检索结构属性?,objective-c,Objective C,我有一个对象,它的属性是如下所示的结构: struct someStruct{ float32 x, y; }; 我要做的是通过字符串调用该struct属性的getter: id returnValue = [theObject performSelector:NSSelectorFromString(@"thePropertyName")]; 但正如您所看到的,“PerformSelect:”返回一个对象,而不是一个结构。我已经尝试了我能想到的所有方法,但都没有成功,这让我觉得我错
struct someStruct{
float32 x, y;
};
我要做的是通过字符串调用该struct属性的getter:
id returnValue = [theObject performSelector:NSSelectorFromString(@"thePropertyName")];
但正如您所看到的,“PerformSelect:”返回一个对象,而不是一个结构。我已经尝试了我能想到的所有方法,但都没有成功,这让我觉得我错过了一些东西——也许是一些简单的东西
你知道如何将returnValue引导回到结构中吗?谢谢
编辑:
不管最初的回复者是谁(他后来因为某种原因删除了他的帖子)——你是对的:根据你的回答,以下内容是有效的:
StructType s = ((StructType(*)(id, SEL, NSString*))objc_msgSend_stret)(theObject, NSSelectorFromString(@"thePropertyName"), nil);
编辑2:可以找到对该问题的相当详细的了解
编辑3:为了对称起见,下面是如何通过字符串名设置struct属性(请注意,这正是接受的答案完成设置的方式,而我的问题要求对上面第一次编辑中提到的getter使用稍微不同的方法):
您可以使用键值编码,将
struct
包装在NSValue
中(并在返回时将其展开)。考虑一个具有Stult属性的简单类,如下所示:
typedef struct {
int x, y;
} TwoInts;
@interface MyClass : NSObject
@property (nonatomic) TwoInts twoInts;
@end
然后,我们可以在一个NSValue
实例中包装和展开struct
,以将其传递给KVC方法和从KVC方法传递出去。下面是使用KVC设置结构值的示例:
TwoInts twoInts;
twoInts.x = 1;
twoInts.y = 2;
NSValue *twoIntsValue = [NSValue valueWithBytes:&twoInts objCType:@encode(TwoInts)];
MyClass *myObject = [MyClass new];
[myObject setValue:twoIntsValue forKey:@"twoInts"];
要获取结构作为返回值,请使用NSValue
的getValue:
方法:
TwoInts returned;
NSValue *returnedValue = [myObject valueForKey:@"twoInts"];
[returnedValue getValue:&returned];
由于最初的(大部分是正确的)反应似乎已经消失在乙醚中,我接受你的答案,因为它解决了一个与我之前遇到的问题非常相似的问题。我对原始帖子的编辑有我需要的特定解决方案。
TwoInts returned;
NSValue *returnedValue = [myObject valueForKey:@"twoInts"];
[returnedValue getValue:&returned];