3

次のような構造体であるプロパティを持つオブジェクトがあります。

struct someStruct{
    float32 x, y;
};

そして、私がやりたいのは、文字列を介してそのstructプロパティのゲッターを呼び出すことです。

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

ただし、ご覧のとおり、「performSelector:」は構造体ではなくオブジェクトを返します。私は思いつく限りのキャスティングの方法を試しましたが、役に立たなかったので、何かが足りないと思いました-おそらく簡単なもの...

returnValueを構造体に戻す方法についてのアイデアはありますか?ありがとう!

編集:元の応答者が誰であったか(彼はその後何らかの理由で彼の投稿を削除しました)-あなたは正しかった:あなたの答えに基づいて、以下は機能します:

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

編集2:問題のかなり詳細な外観はここにあります。

編集3:対称性のために、文字列名で構造体プロパティを設定する方法を次に示します(これは、受け入れられた回答が設定を達成する方法とまったく同じですが、私の問題では、上記の最初の編集で述べたゲッターに対してわずかに異なるアプローチが必要でした):

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

1 に答える 1

4

これを行うには、Key Value Codingを使用して、struct内部をラップしますNSValue(そして、返されたときにラップを解除します)。以下に示すように、structプロパティを持つ単純なクラスについて考えてみます。

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"];

構造体を戻り値として取得するには、NSValuegetValue:メソッドを使用します。

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