Objective-C で変数がオブジェクトかプリミティブかを検出するマクロを探しています。
このコンテキストでは、パラメーターは変数でなければならず、決して式ではないことを知っています。
これが私が思いついた最高のものです:
#define IS_OBJECT(x) ( @encode(__typeof__(x))[0] == '@' )
#define IS_PRIMITIVE(x) ( !IS_OBJECT(x) )
使用法:
NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;
STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");
もっと良い方法があるはずです。
アップデート
@ChrisDevereux のコメントを考慮して、IS_OBJECT マクロを更新しました。
#define IS_OBJECT(x) ( strchr("@#", @encode(__typeof__(x))[0]) != NULL )
合格するようになりました:
NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;
Class classTest = [NSString class];
STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");
STAssertTrue(IS_OBJECT(classTest), @"IS_OBJECT(classTest) must be YES");
私はまだこの答えが好きではありません。もっと滑らかなものがあることを願っています。ランタイム ライブラリにこれを行うものはありますか?