3

IDが返されるため、問題が発生し[NSString strigWithFormat:format]ます。また、NSString変数を他の個人用タイプに変更したコードがたくさんあります。しかし、コンパイラは、NSStringが別のタイプのオブジェクトに設定される場所があることを妨げません。

だから私はNSStringのカテゴリを書いていて、へのすべての呼び出しを置き換えるつもりstringWithFormatですmyStringWithFormat

コードは:

@interface NSString (NSStringPerso)
+ (NSString*) myStringWithFormat:(NSString *)format;
@end



@implementation NSString (NSStringPerso)
+ (NSString*) myStringWithFormat:(NSString *)format {
    return (NSString*)[NSString stringWithFormat:format];
}
@end

コンパイラは、「フォーマットは文字列リテラルでもフォーマット引数でもない」と言っています。

これを機能させる方法はありますか?

4

3 に答える 3

6

NSString可変個引数関数から引数リストを受け取るメソッドが含まれています。このサンプル関数を見てください。

void print (NSString *format, ...) {
    va_list arguments;
    va_start(arguments, format);

    NSString *outout = [[NSString alloc] initWithFormat:format arguments:arguments];
    fputs([output UTF8String], stdout);
    [output release];

    va_end(arguments);
}

そのコードの一部は無関係ですが、重要な行はNSString *output = [[NSString alloc] initWithformat:format arguments:arguments];です。NSStringこれが、可変個引数関数/メソッドでを構築する方法です。


あなたの場合、コードは次のようになります。

+ (NSString *)myStringWithFormat:(NSString *)format, ... {
    va_list arguments;
    va_start(arguments, format);

    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arguments];
    va_end(arguments);

    // perform some modifications to formattedString

    return [formattedString autorelease];
}
于 2011-01-17T21:29:52.130 に答える
1

ここにはObjective-Cの専門家はいませんが、の元のメソッドシグネチャにstringWithFormatは省略記号が含まれています。これにより、形式のプレースホルダーに置き換えられる引数を渡すことができますargument

編集:stringWithFormatいわゆる可変個引数メソッドです。例へのリンクは次のとおりです。

于 2011-01-15T23:58:36.343 に答える
1

ご協力ありがとうございました。あなたのリファレンスドキュメントを読んで、私は解決策を見つけました!

これは動作します:

.hで

@interface NSString (NSStringPerso)
+ (NSString*) strWithFormatPerso:(id)firstObject, ...;
@end

.mで

@implementation NSString (NSStringPerso)
+ (NSString*) strWithFormatPerso:(id)firstObject, ... {

    NSString* a;

    va_list vl;
    va_start(vl, firstObject);
    a = [[[NSString alloc] initWithFormat:firstObject, vl] autorelease];
    va_end(vl);

    return a;
}
@end
于 2011-01-16T01:02:43.003 に答える