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函数的名称
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"]);
}