2011-10-13 64 views
1

當我使用componentsJoinedByString時,我只是得到一串很長的數字。如何將[Number numberWithChar:c]的NSArray加入到NSString中?

編輯:我意識到這個任務很混亂。爲什麼地球上會有人用NSNumbers填充NSArray,如果他們想要NSString的話?答案是我正在編寫一個可擴展的單元測試框架。基本功能genNum,genBoolgenChar分別生成隨機int,BOOL和char值的NSNumbers。然後有genArray它使用指定的生成器生成隨機數組。因此,要構建一個隨機NSString,可以使用genChar生成器運行genArray,並將生成的NSArray轉換爲NSString。

的字符只存儲爲NSNumber S的代替char原因可能會技術性:genArray接受一個塊並調用塊100-奇數倍來填充的NSArray。塊必須保存ObjC對象;不是原始類型。

所以問題依然存在:如何將[NSNumber numberWithChar:c]的NSArray加入到NSString中?

+0

發佈更多的NSArray元素和你的期望。 – zaph

+2

您可能需要「手工」遍歷數組,並通過檢查每個元素來構造字符串,而不是嘗試使用類似'componentsJoinedByString:'的東西。 –

回答

1
+ (NSString *) genString { 
    NSArray* arr = [self genArray: ^() { return [ObjCheck genChar]; }]; 

    NSMutableString* s = [NSMutableString stringWithCapacity: [arr count]]; 

    int i; 
    for (i = 0; i < [arr count]; i++) { 
     [s appendString: [NSString stringWithFormat: @"%c", [[arr objectAtIndex: i] charValue]]]; 
    } 

    return s; 
} 
+0

這是一個好的開始,但我有幾個問題。首先,爲什麼要用NUL字節預先填充數組?你只是要覆蓋這些字節中的每一個字節。其次,你實際上並不是NUL終止,因爲你只填充到'[arr count]'。第三,如果你真的想要零填充,只需使用'calloc()'而不是'malloc()'。第四,你假定所有的char都是<= 127. 128到255之間的任何字符都不會是有效的UTF-8字節。這最後一個問題需要詢問OP他想要什麼 - 對待unicode codepoints,或只是選擇一種編碼? –

+0

根據我的經驗,當爲cstring分配空間時,那裏經常會有隨機數據,它會阻塞NUL字節,可能是我的malloc()事情有多糟糕。但是你的技術要點是正確的。/facepalm,我甚至沒有把NUL放在應該去的地方。由於genChar會自動調整128以上的隨機整數,所以不會超過127(請參閱GitHub上的代碼)。 – mcandre

1

componentsJoinedByString將數組元素連接成一個字符串,並在它們之間帶有分隔符。數組元素轉換爲字符串(如果尚未NSString「使用description方法。如果你有NSNumbers N排列我希望一個有趣的結果。

+0

發佈更新以進行說明。 – mcandre

1

爲什麼不[NSString stringWithCharacters:c length:1]填寫您的陣列?如果componentsJoinedByString:應該工作。 (檢查文檔上stringWithCharacters:length:,以上僅僅是爲了說明您可能需要使用&c,例如。)

+0

發佈更新以進行澄清。 – mcandre

0
+ (id)genString { 
    NSArray *chars = [self genArray:^{ return [ObjCheck genChar]; }]; 

    if ([chars count] == 0) { 
     return @""; 
    } 

    unichar *buffer = malloc(sizeof(unichar) * [chars count]); 

    [chars enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) { 
     buffer[idx] = (unichar)[num charValue]; 
    }]; 

    return [[[NSString alloc] initWithCharactersNoCopy:buffer length:[chars count] freeWhenDone:YES] autorelease]; 
} 

這個特殊的解決方案將承擔字符> 127應被視爲Unicode碼點(對於字符大小的值,這基本上意味着ISO-8859-1)。它還避免了在創建結果字符串時複製緩衝區。

+0

爲什麼在NSString上使用CFString? – mcandre

+0

對不起,我忘了投它。 CFString是NSString。實際上,我不能忍受查找正確的NSString等價物。我現在編輯它來代替使用NSString方法。 –

+0

@mcandre:好的,它現在使用NSString。我還添加了我已經忘記的'-autorelease'。猜猜這就是我在瀏覽器中編寫代碼所得到的結果。 –