6

引数の変数リストを渡すメソッドがあります。文字列などに対して行いisKindOfClassます。ただし、ivarがBOOLであるかどうかをどのように判断できますか?

4

2 に答える 2

4

いいえ、実行時ではありません。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

于 2012-07-30T10:34:10.220 に答える
0

Key Value Codingは、これを支援できる可能性があります。valueForKey:オブジェクトのivarを検査し、ビルトインの変換を実行できるプリミティブ(例)があります。その意味で、キー(文字列としてのivar名)を関数に渡しNSNumber、型がCプリミティブである場合にシステムに変換を実行させます。もちろん、これはいくらかのオーバーヘッドをもたらします。

objcランタイムを使用してこれにアプローチすることもできますが、KVCは、objcランタイム(自分自身)を使用することなく、必要なことを実行する可能性があります。

va_list パラメーターがであるかどうかを判別する場合は、パラメーターBOOLを指定する必要があります(そのため、フォーマット指定子が必要です)。場合によっては別の方法があります。-[NSArray initWithObjects:...]この場合、初期化子はすべてのパラメーターにobjcオブジェクトと、nil-terminationを必要とします。BOOL->オブジェクトの昇格を行う必要があります。

代替案:C ++は、このタイプの情報をすべて提供できます(テンプレートの使用など)。

于 2012-07-30T11:28:16.073 に答える