NSStringFromAnyObject 的创建是由于 EchoLogger 项目 的进化,该项目曾经提供相同的功能:通过 Clang 的 __attribute__((overloadable))
提供任意对象(无论是 Objective-C 还是 C 对象)的 NSString
表示。
NSStringFromAnyObject 使用 Objective-C 运行时内省,因为它似乎是一个更一致的解决方案(尽管可能稍微慢一点)。它受到了由 Yan Rabovik 编写的 ATLog 项目 的启发。
目前支持以下类型
id
即 %@
Class
SEL
NSRange
void *
和 const void *
指针。BOOL
、double
、float
、int
、long
等。char *
和 const char *
。structs
,如两个浮点数或四个双精度浮点数的结构(例如 MKMapSize、MKMapRect 和类似)。CGRect
、CGSize
、CGPoint
。NSStringFromAnyObject 可以通过添加额外的 "任意对象处理器" 来扩展:查看 UIKit 对象处理器的编写方式:它们与主 C/Objective-C "任意对象处理器" 解耦,因此如果需要这些框架,可以手动包含。查看代码以了解如何编写自定义处理器。
欢迎反馈!”
#import <Foundation/Foundation.h>
#import "UIKit.h"
#import "NSStringFromAnyObject.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *objectRepresentation;
// Objective-C
objectRepresentation = NSStringFromAnyObject( nil );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( @[ @(1) ] );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( @(1) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( [@(1) class] );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( @selector(main) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
// Foundation
objectRepresentation = NSStringFromAnyObject( NSMakeRange(0, 10) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
// C pointers
objectRepresentation = NSStringFromAnyObject( NULL );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
void *ptr = &printf;
objectRepresentation = NSStringFromAnyObject( ptr );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
const void *const_ptr = &printf;
objectRepresentation = NSStringFromAnyObject( const_ptr );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
// C numbers
objectRepresentation = NSStringFromAnyObject( (BOOL)YES );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( 1.24 );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( 1.24f );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( 1 );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( (short)1 );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( (long)1000L );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( (long long)100000000000LL );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( (char)'c' );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( (unsigned char)'c' );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
// C strings
char *str = "A string";
const char *conststr = (const char *)str;
objectRepresentation = NSStringFromAnyObject( str );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( conststr );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
// UIKit
objectRepresentation = NSStringFromAnyObject( CGRectMake(0, 0, 200, 200) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( CGPointMake(0, 0) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
objectRepresentation = NSStringFromAnyObject( CGSizeMake(0, 0) );
printf("%s\n", [objectRepresentation cStringUsingEncoding:NSUTF8StringEncoding]);
}
return 0;
}
nil/NULL
(__NSArrayI)(
1
)
@(1)
(Class)__NSCFNumber
(SEL)main
(NSRange){0, 10}
nil/NULL
(void *)0x7fff88bd7948
(const void *)0x7fff88bd7948
YES
(double)1.240000
(float)1.240000
(int)1
(short)1
(long)1000
(long)100000000000
(char)c
(unsigned char)c
(char *)A string
(const char *)A string
(CGRect){0.000000, 0.000000, 200.000000, 200.000000}
(CGPoint){0.000000, 0.000000}
(CGSize){0.000000, 0.000000}
Program ended with exit code: 0
由于基于 void *
的黑客式实现,NSStringFromAnyObject 对于以下类型的数据不起作用
char str1[] = "12345";
char str2[6] = "12345";
NSLog(@"%@", NSStringFromAnyObject(str1));
NSLog(@"%@", NSStringFromAnyObject(str2));
=>
NSStringFromAnyObject: unsupported type: ([6c])
NSStringFromAnyObject: unsupported type: ([6c])
int *nums = malloc(3 * sizeof(int));
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
NSLog(@"%@", NSStringFromAnyObject(nums));
=>
NSStringFromAnyObject: unsupported type: (^i)
已知所有其他典型对象类型都受支持。
版权 (c) 2014 Stanislaw Pankevich。有关详细信息,请参阅 LICENSE。