2

typed入力として辞書を取り、そこから値の文字列を作成する特殊なロガーを実装しようとしています。

そのような辞書の 1 つのサンプルは次のようになります。

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 関数の名前ができました。

  1. 文字列から実際に呼び出すことができる C 関数に変換するにはどうすればよいですか?

  2. 上記のセレクターの使用は、その戻り値の型がid次のようにNSNumber *変化CGRectする可能性があるため不明CGSizeです。

なにか提案を?

4

1 に答える 1