4

フォーマット付きのNSStringを受け入れる独自のクラスのメソッドをどのように定義しますか?

私はそれを使っているいくつかの異なるものを見ますNSLog[NSPredicate predicateWithFormat:(NSString *)predicateFormat, ...]そしてもちろん[NSString stringWithFormat:(NSString *)format, ...]

また、ヘッダーファイルでは、NSLogとstringWithFormatの宣言後に次のようになります NS_FORMAT_FUNCTION(1,2)。グーグルは、これが何を意味するのかを私に伝えるのにあまり役立ちませんでした。

明らかに省略記号はフォーマットパラメータですが、メソッド自体でそれらを処理する方法がわかりません。

4

2 に答える 2

7

あなたはいくつかのCコードを利用する必要があります:

- (void)someMethod:(NSString *)format,... {
    va_list argList;
    va_start(argList, format);
    while (format) {
        // do something with format which now has next argument value
        format = va_arg(argList, id);
    }
    va_end(argList);
}

そして、NSString次のように引数をに転送することができます。

- (void)someMethod:(NSString *)format,... {
    va_list args;
    va_start(args, format);
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);
}
于 2012-10-29T14:56:53.500 に答える
2

引数の数が可変のObjective-Cメソッドを探しています。これがどのように行われるかです:

ヘッダーの宣言:

- (void)setContentByAppendingStrings:(NSString *)firstString, ... 
   NS_REQUIRES_NIL_TERMINATION;

実装:

- (void)setContentByAppendingStrings:(NSString *)firstArg, ...
{
    NSMutableString *newContentString = [NSMutableString string];

    va_list args;
    va_start(args, firstArg);
    for (NSString *arg = firstArg; arg != nil; arg = va_arg(args, NSString*))
    {
        [newContentString appendString:arg];
    }
    va_end(args);

    contents = newContentString;
}

出典:CocoaWithLove

于 2012-10-29T14:56:37.143 に答える