3

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

struct someStruct{
    float32 x, y;
};

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

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

但正如您所见,“performSelector:”返回的是一个对象,而不是一个结构。我尝试了所有我能想到的投射方式,但无济于事,这让我觉得我错过了一些东西——也许是一些简单的东西......

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

编辑:无论最初的回复者是谁(他后来出于某种原因删除了他的帖子) - 你是对的:根据你的回答,以下内容有效:

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

编辑 2:可以在此处找到对该问题的相当详细的了解。

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

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

1 回答 1

4

您可以使用键值编码通过包装struct内部来做到这一点NSValue(并在返回时解开它)。考虑一个具有结构属性的简单类,如下所示:

typedef struct {
    int x, y;
} TwoInts;

@interface MyClass : NSObject

@property (nonatomic) TwoInts twoInts;

@end

然后,我们可以struct在一个NSValue实例中包装和解包,以将其传递给 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'sgetValue:方法:

TwoInts returned;
NSValue *returnedValue = [myObject valueForKey:@"twoInts"];
[returnedValue getValue:&returned];
于 2013-01-21T03:08:27.323 回答