引数の変数リストを渡すメソッドがあります。文字列などに対して行いisKindOfClass
ます。ただし、ivarがBOOLであるかどうかをどのように判断できますか?
2 に答える
いいえ、実行時ではありません。BOOLはプリミティブ型であり、クラスではありません。実際、BOOLは署名された文字です。
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED
#define YES (BOOL)1
#define NO (BOOL)0
回避策として、BOOLをNSNumberでラップして、そこからObj-Cオブジェクトを作成できます。次に、ランタイムチェックを実行できます。
NSNumber * n = [NSNumber numberWithBool:YES]; // @(YES) in Xcode 4.4 and above
if (strcmp([n objCType], @encode(BOOL)) == 0) {
NSLog(@"this is a bool");
} else if (strcmp([n objCType], @encode(int)) == 0) {
NSLog(@"this is an int");
}
編集:このコードは、内部でcharとしてエンコードされているため、BOOLでは機能しない可能性があります。別の解決策については、この回答を参照してください:https ://stackoverflow.com/a/7748117/550177
Key Value Codingは、これを支援できる可能性があります。valueForKey:
オブジェクトのivarを検査し、ビルトインの変換を実行できるプリミティブ(例)があります。その意味で、キー(文字列としてのivar名)を関数に渡しNSNumber
、型がCプリミティブである場合にシステムに変換を実行させます。もちろん、これはいくらかのオーバーヘッドをもたらします。
objcランタイムを使用してこれにアプローチすることもできますが、KVCは、objcランタイム(自分自身)を使用することなく、必要なことを実行する可能性があります。
va_list
パラメーターがであるかどうかを判別する場合は、パラメーターBOOL
を指定する必要があります(そのため、フォーマット指定子が必要です)。場合によっては別の方法があります。-[NSArray initWithObjects:...]
この場合、初期化子はすべてのパラメーターにobjcオブジェクトと、nil-terminationを必要とします。BOOL
->オブジェクトの昇格を行う必要があります。
代替案:C ++は、このタイプの情報をすべて提供できます(テンプレートの使用など)。