Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIKit增补:弥合eg CGRectValue和NSStringFromCGRect之间的差距?_Objective C_Uikit_Objective C Runtime - Fatal编程技术网

Objective c UIKit增补:弥合eg CGRectValue和NSStringFromCGRect之间的差距?

Objective c UIKit增补:弥合eg CGRectValue和NSStringFromCGRect之间的差距?,objective-c,uikit,objective-c-runtime,Objective C,Uikit,Objective C Runtime,我试图实现一个专门的类型化的记录器,它将字典作为输入,并从中创建值字符串 此类词典的一个示例可能是: CGSize size = {300, 200} ; CGAffineTransform t = ::CGAffineTransformIdentity ; [self logit: @{ @"columns": @{ @"value": @3 , @"type": @"NSNumber" } , @"size": @{ @"va

我试图实现一个专门的
类型化的
记录器,它将字典作为输入,并从中创建值字符串

此类词典的一个示例可能是:

CGSize size = {300, 200} ;
CGAffineTransform t = ::CGAffineTransformIdentity ;

[self logit: @{
    @"columns": @{
        @"value": @3
    ,   @"type": @"NSNumber"
    }
,   @"size": @{
        @"value": [NSValue valueWithCGSize(size)]
    ,   @"type": @"CGSize"
    }
,   @"transform": @{
        @"value": [NSValue valueWithCGAffineTransform(t)]
    ,   @"type":    @"CGAffineTransform"
    }
}] ;
问题是:如何以通用方式检索这些值

我显然会写

    for (NSString * key in dict) {
        NSDictionary * params = dict[key] ;

        if ([params[@"type"] isEqualToString: @"CGRect"]) {
            CGRect r = [params[@"value"] CGRectValue] ;
            NSString * s = ::NSStringFromCGRect(r) ;
            ::NSLog(s) ;
        } else if ([params[@"type"] isEqualToString: @"NSNumber"]) {
            ::NSLog(@"%.3f", [params[@"value"] floatValue]) ;
        } else if ([params[@"type"] isEqualToString: @"CGAffineTransform"]) {
            CGAffineTransform t = [params[@"value"] CGAffineTransformValue]
            NSString * s = ::NSStringFromCGAffineTransform(t) ;
            ::NSLog(s) ;
        }
        ...
    }
但我宁愿写一个更“通用”的解决方案。大致如下:

SEL valueSelector = ::NSSelectorFromString([NSString stringWithFormat:@"%@Value", params[@"type"]) ;
NSString * rawCFunctionName = [NSString stringWithFormat:@"NSStringFrom%@", params[@"type"]] ;
现在我有了一个选择器和一个C函数的名称

  • 如何从一个字符串转换成一个我可以实际调用的C函数

  • 使用上述选择器是不清楚的,因为其返回类型可以从
    id
    变化,例如:在
    NSNumber*
    的情况下,到“纯C对象”,例如在
    CGRect
    的情况下,
    CGSize

  • 有什么建议吗

  • 你不能;见“”

  • 是的,您必须在编译时知道返回类型

  • 然而,一切都没有失去:你所要做的实际上可以以一种相当平凡的方式完成
    NSValue
    有一个非常好的特性,它的
    description
    方法为它存储的类型提供了与相应的
    NSStringFrom…()
    函数非常相似的输出(它可能在引擎盖下使用它们)。例如:

    NSLog(@"%@", [NSValue valueWithCGAffineTransform:CGAffineTransformMake(10, 10, 10, 10, 10, 10)]);
    NSLog(@"%@", [NSValue valueWithCGSize:CGSizeMake(10, 10)]);
    
    收益率:

    2013-08-11 03:06:43.053打印NSValue[51538:11303]CGAffineTransform:{{10,10,10},{10,10}
    2013-08-11 03:06:43.055打印NSValue[51538:11303]NSSize:{10,10}

    NSNumber
    同样可以很好地表示其值作为其描述

    所以你要做的就是这样:

    for( NSString * key in theDictionary ){
        NSLog(@"%@: %@", key, theDictionary[key][@"value"]);
    }