可以通过Objective-C中的字符串名称检索struct属性吗?

时间:2013-01-21 02:45:32

标签: objective-c

我有一个具有属性的对象,该属性是如下结构:

struct someStruct{
    float32 x, y;
};

我想要做的是通过字符串调用该struct属性的getter:

id returnValue = [theObject performSelector:NSSelectorFromString(@"thePropertyName")];

但是你可以看到“performSelector:”返回一个对象,而不是一个结构。我已经尝试了我能想到的各种铸造方式,无济于事,这让我觉得我错过了一些东西 - 也许是一件容易的事......

任何想法如何将returnValue哄回一个结构体?谢谢!

编辑: 无论最初的响应者是谁(他因为某些原因而删除了他的帖子) - 你是对的:根据你的回答,以下内容有效:

StructType s = ((StructType(*)(id, SEL, NSString*))objc_msgSend_stret)(theObject, NSSelectorFromString(@"thePropertyName"), nil);

编辑2:可以找到相当详细的问题here

编辑3:为了对称起见,这里是如何通过其字符串名称设置struct属性(请注意,这正是接受的答案完成设置的方式,而我的问题需要对第一次编辑中提到的getter略有不同的方法以上):

NSValue* thisVal = [NSValue valueWithBytes: &thisStruct objCType: @encode(struct StructType)];
[theObject setValue:thisVal forKey:@"thePropertyName"];

1 个答案:

答案 0 :(得分:4)

您可以使用键值编码来执行此操作,方法是将struct包装在NSValue内(并在返回时将其展开)。考虑一个带有struct属性的简单类,如下所示:

typedef struct {
    int x, y;
} TwoInts;

@interface MyClass : NSObject

@property (nonatomic) TwoInts twoInts;

@end

然后我们可以在struct实例中包装和展开NSValue以将其传递给KVC方法和从KVC方法传递。以下是使用KVC设置struct值的示例:

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的{​​{1}}方法:

getValue: