2010-02-15 56 views
4

今天我必須被困在stoopid上,因爲我花了一個多小時試圖瞭解如何使這個iPhone項目中的變量參數工作。在下面的單元測試中,有人能幫我獲得一個綠色條嗎?我哪裏錯了?iPhone中的變量參數ObjC函數

#import <SenTestingKit/SenTestingKit.h> 

@interface VAArgsTest : SenTestCase 
{ 

} 

@end 

NSString* vaArgsAppend(NSString *first, ...) 
{ 
    NSMutableString *list = [[NSMutableString alloc] initWithString:first]; 
    id eachArg; 
    va_list argumentList; 
    va_start(argumentList, first); 
    while(eachArg = va_arg(argumentList, id)) { 
    if(eachArg)[list appendString:(NSString*)eachArg]; 
    } 
    va_end(argumentList); 
    return [list autorelease]; 
} 

@implementation VAArgsTest 

-(void) testCallVaArgsAppend 
{ 
    NSString *result = vaArgsAppend(@"one ", "two ", @"three"); 
    STAssertEqualObjects(result, @"one two three", @"Expected appended string."); 
} 

@end 
+0

如果你能解釋它是如何失敗的話,這將有所幫助。顯然,斷言失敗,但是結果字符串中返回的內容是什麼? – TechZen 2010-02-15 20:53:39

回答

6

更改此:

NSString *result = vaArgsAppend(@"one ", "two ", @"three"); 

這樣:

NSString *result = vaArgsAppend(@"one ", @"two ", @"three", nil); 

當你寫一個可變參數的方法,你必須要確定有多少參數讀取的一種手段。執行此操作的最常見方法是在傳入的列表中查找終止值。您沒有達到終端條件。

+0

非常感謝!我仍然不習慣在我的參數列表中包含終端零。 – Cliff 2010-02-15 22:36:45

3

另外,「two」是一個const char *,不是一個id。各種有趣的後果可能會因爲像id一樣對待而產生。用@「two」替換。

另外,如果(eachArg)是無關的。

+0

我想檢查這兩個答案是否正確。好眼睛!我在第二個參數中錯過了@符號。 – Cliff 2010-02-15 22:37:17