我有一个具有属性的对象,该属性是如下结构:
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"];
答案 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: