2013-03-28 57 views
1

我知道方法stringWithFormat通常採用如下:[NSString stringWithFormat]需要什麼類型的參數?

[NSString stringWithFormat: @"%@ %@", arg1, arg2]; 

我的問題是,究竟是此方法(在一個與規格...)的最後一個參數的類型。

我希望能夠做一些類似如下:

NSArray *array = [NSArray arrayWithObjects: @"Hi", @"Bob"]; 
[NSString stringWithFormat: @"%@ %@", array] 

正如你可以看到一個數據結構array持有的所有參數。不幸的是,這不起作用。有沒有辦法做到這一點,以便我不必在stringWithFormat方法中明確列出所有參數?

+0

您的第二個示例應該在XCode中顯示錯誤「數據轉換比數據參數多」。 –

+0

它採用[documentation]中指定的類型(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265 )。 –

回答

5

[NSString stringWithFormat]需要什麼類型的參數?

無論您使用其格式字符串如何告訴它這樣做。

我的問題是,究竟是該方法

這不是最後一個參數的最後一個參數的類型。這是一個被稱爲「可變參數函數」的概念(或者在這種情況下是方法)。 ...表示該函數可以接受任意數量的參數。這是C的一個特性,您可以通過使用C標準庫頭文件<stdarg.h>中的類型,宏和函數來使用它。例如:這將創建一個包含給定對象的數組。

- (NSArray *)arrayWithCountAndObjects:(int)count, ... 
{ 
    NSMutableArray *arr = [NSMutableArray array]; 

    va_list args; 
    va_start(args, count); 
    for (int i = 0; i < count; i++) { 
     [arr addObject:va_arg(args, id)]; 
    } 
    va_end(args); 

    return arr; 
} 

然而,應該在這裏做的僅僅是在加入陣列,而不是與可變參數黑客中的項目,因爲這是不必要的:

NSArray *arr = @[@"Hello", @" ", @"world!"]; 
NSString *s = [arr componentsJoinedByString:@""]; 
0

你不想使用帶格式的字符串,如果數組包含字符串,那麼你想使用數組方法componentsJoinedByString :.只要傳遞@「」作爲字符串,如果你想在字符串之間有一個空格。

0

它採用可變參數。如果你想查找函數的類型,它被稱爲「variadic」。

在這種特定情況下,這些參數由您指定的格式化字符串決定。 %@表示任何可可物體(繼承於NSObject)。 %s表示一個c字符串(以空字符結尾的字符數組)。 %d表示一個int,%f表示浮點數或雙精度,依此類推。其中有很多(除%@都從C的printf函數借用)。你可以在這裏找到完整的細節:http://www.cplusplus.com/reference/cstdio/printf/和這裏https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html#//apple_ref/doc/uid/20000943

至於你的嘗試,那不是它的工作原理。您只需將陣列拆分爲單獨的參數,或使用componentsJoinedByString,或者如果需要更多控制,則可以手動循環。但是,您可以使用單個%@以自己的格式顯示陣列,可能類似於[First Value; Second Value]

相關問題