0

私は Objective-C でカスタムの Variadic ロギング関数を作成しようとしています。具体的には、NSLog に送信するような文字列形式を「再構築」したいと考えています。私は Variadic 関数を理解しようとしましたが、さまざまな側面を説明するために使用される言語は私の頭の中にあり、私が見つけたすべての例は、文字列形式を再構築するのではなく、整数の束を合計することに関するものです。

私がやろうとしていることの非常に単純な例は次のようになります:

(void) myLog (NSString*string,...) {
    NSLog(string,...);
}

つまり、典型的な文字列形式を関数に持ち込み、その形式を関数内の文字列として再構築したいと考えています。

これは非常に単純な例であると述べたように、単純に再度送信するだけでなく、さらに多くのことが行われるため、これを実行したい理由は他にもあります。これらの理由はさておき: Variadic 関数内で文字列形式を再構築するにはどうすればよいですか?

アップデート:

現在、次のコードを使用しています。

- (void) output:(NSString*)string {
    [_outputStorage appendAttributedString:[[NSAttributedString alloc] initWithString:string attributes:[NSDictionary dictionaryWithObject:[NSFont boldSystemFontOfSize:[NSFont smallSystemFontSize]] forKey:NSFontAttributeName]]];
    DDLogVerbose(@"%@", string);
}
...
[self output:[NSString stringWithFormat:@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]];

現在、これは機能しますが、呼び出し (上記の最後の行) はかなり判読できません。次のように呼び出したいと思います。

myLog(@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]);

技術的に言えば、現在のコードは問題なく動作します。この変更を行う理由は、2 番目の方法の方がはるかに読みやすいからです! 「MyLog(...」で始まる行は、「[self output:[NSString stringWithFormat:...」よりもはるかに読みやすいです。

4

1 に答える 1

1

あなたはこれを行うことができます:

(void)myLog(NSString *format, ...) {
    va_list args;
    va_start(args, format);
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);

    NSLog(@"%@", msg);
}

そして、好きなように呼び出します:

myLog(@"You started out with %i tabs and I deleted %i (%i%%) of them.\n", totalTabs, deletedTabs, totalTabs ? 100*deletedTabs/totalTabs : 0]);
于 2013-07-20T03:24:17.980 に答える