Objective Cの動的なプリミティブ型のプロパティ設定
-
06-07-2019 - |
質問
私はライブラリを書き込もうとしており、それが有用であるように十分に汎用的です。問題は、他のクラスのプロパティを更新する必要があることです。プロパティとクラスの両方が動的でなければなりません。
パブリック変数を使用して問題なく実行できるようになりました。更新したい変数へのポインタを渡すだけです。ただし、クラスのプロパティも客観的なCで非常に広く使用されているため、クラスのプロパティを設定することも非常に便利です。
ここでも、プロパティがオブジェクトタイプであり、プリミティブタイプのプロパティを設定しようとしている限り、これは問題ではありません。
現在のコードは、これらの行に沿ってプロパティを探します:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];
ただし、setArgumentメソッドはポインター型のみを許可しますが、プロパティは任意のプリミティブ型を持つことができます。プリミティブ型のプロパティを動的に割り当てる方法はありますか?
解決
KVOが変換を行う必要があります:
[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];
myVar
が次のように定義されている場合、は NSNumber
をintに変換します。
int myVar;
...
@propery (nonatomic) int myVar;
他のヒント
"ただし、setArgumentメソッドでは、ポインタ型のみが許可されます"あなたは何かが欠けています。 setArgument:
の引数は、メソッドに渡すデータではありません。これは、渡すデータ( whatever タイプ)のアドレスです。現在、上記のコードはオブジェクトポインターのアドレスを取得します(これはポインターへのポインターです)。整数のアドレスを取るように簡単にできます(気にしません)。つまり、タイプに関係なく、まったく同じコードがすでに機能しています:
NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
所属していません StackOverflow