1、如果你想知道NSNumber中具體的資料類型,那麼@encode關鍵字就派上用場了。
使用@encode(aType) 可以返回該類型的C字串,用const char *表示。比如 @encode(int) 返回的是 i;@encode(float) 返回的是 f。
然後通過NSValue中的 objCType 方法返回的const char *與上面的對比就OK了。使用strcmp按ASCII值大小相比較。
int a = 10;NSNumber *number = [NSNumber numberWithInt:a];if (strcmp([number objCType], @encode(int)) == 0) { int result = [number intValue]; NSLog(@"%d", result);}
2、Objective-C 的資料類型,甚至自訂類型、函數或方法的元類型,都可以使用 ASCII 編碼。
NSLog(@"int : %s", @encode(int)); NSLog(@"float : %s", @encode(float)); NSLog(@"float * : %s", @encode(float*)); NSLog(@"char : %s", @encode(char)); NSLog(@"char * : %s", @encode(char *)); NSLog(@"BOOL : %s", @encode(BOOL)); NSLog(@"void : %s", @encode(void)); NSLog(@"void * : %s", @encode(void *)); NSLog(@"NSObject * : %s", @encode(NSObject *)); NSLog(@"NSObject : %s", @encode(NSObject)); NSLog(@"[NSObject] : %s", @encode(typeof([NSObject class]))); NSLog(@"NSError ** : %s", @encode(typeof(NSError **))); int intArray[5] = {1, 2, 3, 4, 5}; NSLog(@"int[] : %s", @encode(typeof(intArray))); float floatArray[3] = {0.1f, 0.2f, 0.3f}; NSLog(@"float[] : %s", @encode(typeof(floatArray))); typedef struct _struct { short a; long long b; unsigned long long c; } Struct; NSLog(@"struct : %s", @encode(typeof(Struct)));
結果是:
int : ifloat : ffloat * : ^fchar : cchar * : *BOOL : cvoid : vvoid * : ^vNSObject * : @NSObject : {NSObject=#}[NSObject] : #NSError ** : ^@int[] : [5i]float[] : [3f]struct : {_struct=sqQ}
參考:http://nshipster.com/type-encodings/