NSStringFromAnyObject 0.0.4

NSStringFromAnyObject 0.0.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2014年12月

Stanislaw Pankevich维护。



  • Stanislaw Pankevich

NSStringFromAnyObject 的创建是由于 EchoLogger 项目 的进化,该项目曾经提供相同的功能:通过 Clang 的 __attribute__((overloadable)) 提供任意对象(无论是 Objective-C 还是 C 对象)的 NSString 表示。

NSStringFromAnyObject 使用 Objective-C 运行时内省,因为它似乎是一个更一致的解决方案(尽管可能稍微慢一点)。它受到了由 Yan Rabovik 编写的 ATLog 项目 的启发。

目前支持以下类型

  • Objective-C 类型
    • 对象 id%@
    • Class
    • 选择器 SEL
  • 基金会
    • NSRange
  • C 类型
    • void *const void * 指针。
    • 数值类型: BOOLdoublefloatintlong 等。
    • C 字符串:char *const char *
    • 典型的 structs,如两个浮点数或四个双精度浮点数的结构(例如 MKMapSize、MKMapRect 和类似)。
  • UIKit 类型:CGRectCGSizeCGPoint

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])
  • C 数组(不包括 C 字符串)
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。