我正在尝试实现一个专门的typed
记录器,它将字典作为输入并从中创建值字符串。
一个这样的字典样本可能是:
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
等的情况下......
有什么建议吗?