5

この質問の仕方が正確にはわかりません。stringWithFormat:orのようなメソッドを作成したいpredicateWithFormat:。つまり、メソッドは引数を書式指定子付きの文字列として直接受け入れます。どうすればこれを達成できますか?

例えば、

-(void) someMethod: (NSString *)str, format; 

後で次のように呼び出すことができるように:

[someObject someMethod:@"String with format %@",anotherString];

これは、特定のコンテキストとは関係ありません。

predicateWithFormat次のようなコードで作業していました。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"];

これはうまくいきませんでしたが:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"];

次のように機能しました:

NSString *str = @"myName";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str];

したがって、これは、指定された引数に内部で使用されている書式指定子があるかどうかをメソッドが理解できることを意味します。どうすればこれを行うことができますか?

4

2 に答える 2

11

varargs マクロva_startva_endなどを使用します。

-(void) someMethod: (NSString *)fmt, ...
{
    va_list va;
    va_start(va, fmt);    
    NSString *string = [[NSString alloc] initWithFormat:fmt
                                              arguments:va];
    va_end(va);

    // Do thing with string
}

覚えておくべき重要なことは、vararg パラメーターは型を失うため、関数はフォーマット文字列printf()[NSString stringWithFormat]使用して、引数の数とそれぞれの解釈方法を決定するのに役立つことです。別のセマンティックが必要な場合は、この情報を何らかの方法で提供する必要があります。

于 2012-07-04T12:57:08.097 に答える
5

可変数のパラメーターを持つメソッドを探しています。メソッドは次のように宣言する必要があります。

-(void) someMethod: (NSString *)str, ...; // Yes, three dots

メソッド内で、マクロを使用してパラメーターを 1 つずつ抽出します。最初のパラメーターは、渡される他のパラメーターの数を伝えるのに十分な情報を提供する必要があります。たとえば、エスケープされていない書式指定子stringWithFormatを数えることで、渡されたパラメーターの数を知ることができます。%

- (void) someMethod:NSString *)str, ... {
    va_list args;
    va_start(args, str);
    int some_count = /* figure out how many args there are */;
    for( int i = 0; i < some_count; i++ ) {
        value = va_arg(args, <some_type>); // You need to derive the type from the format as well
    }
    va_end(args);
}
于 2012-07-04T12:58:06.703 に答える