2012-10-29 48 views
3

如何在自己的類中定義接受帶格式NSString的方法?使用格式爲NSString的方法定義方法

我看到它使用幾個不同的東西像NSLog[NSPredicate predicateWithFormat:(NSString *)predicateFormat, ...]當然[NSString stringWithFormat:(NSString *)format, ...]

此外,在頭文件的NSLog和stringWithFormat有他們之後的聲明如下: NS_FORMAT_FUNCTION(1,2)。 Google告訴我這意味着什麼沒有幫助。

顯然省略號是格式參數,但我不知道如何在方法本身中處理它們。

回答

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; 
} 

來源:Cocoa With Love

+0

的'NS_FORMAT_FUNCTION'宏已取代了'NS_REQUIRES_NIL_TERMINATION'的這種特定用途(對於具有任意可變參數的格式字符串)。 – erikprice

+0

NS_FORMAT_FUNCTION需要2個參數。第一個是格式字符串的索引,第二個是'...'的索引。所以在這個例子中+(id)errorWithCode:(NSInteger)代碼格式:(NSString *)格式,... NS_FORMAT_FUNCTION(2,3); 2是格式和3是... – malhal

5

你需要使用一些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); 
} 

如果你只是想傳遞一個字符串格式這些東西,然後這個工程:

- (void)someMethod:(NSString *)format,... { 
    va_list args; 
    va_start(args, format); 
    NSString *msg = [[NSString alloc] initWithFormat:format arguments:args]; 
    va_end(args); 
} 
+0

第二個代碼片斷是完美的謝謝! – malhal