2010-10-30 29 views
2

所以我有一個方法,需要一個NSString作爲參數,我希望該方法基本上分解成單個字符並將它們存儲在一個數組(NSArray)中。我會如何將NSString分解爲單個字符?

I other words我想讀取字符串中的每個字符,並按照相同的順序將各個字符存儲在一個數組中,以便我可以在稍後處理單個字符。

有什麼想法?

回答

7

遍歷字符串,使用characterAt - 並將每個字符追加到NSMutableArray。

但是,如果你這樣做 - 爲什麼麻煩把它們放在NSArray呢?

NSMutableArray *myArray = [[NSMutableArray] alloc] initWithCapacity:[string length]]; 

for (i=0;i<[string length];i++) { 
    unichaar ch; 
    ch = [string characterAtIndex:i]; 
    NSLog(@"Processing charachter %c",ch); 

    // If you really want 
    [myArray addObject:(id) ch]; 
} 
+0

是的好點,我不妨像過去一樣過程。非常感謝,我會試一試。 – cgossain 2010-10-30 18:42:30

+1

更正:1)它是'unichar' 2)[[NSMutableArray alloc] initWithCapacity:'將使用默認的分配器。默認的分配器假設'id',並且將發送保留/釋放消息給unichars - 當然這會崩潰。你有兩個選擇:對每個字符使用NSString,或者下拉使用自定義分配器分配一個CFMutableArray,該分配器不對unichars執行引用計數 – justin 2010-10-30 18:45:07

+0

@Justin - 謝謝,是的,你的權利。 NSArray是一個事後的想法 - 因爲,正如我所建議的,他甚至不需要它。 – Brad 2010-10-30 18:48:29

0

除了布拉德回答(在那裏他展示了每個角色當然存儲在NSArray例如,如果你想要的),你也有更直接的機會得到NSString值作爲一個普通的老C語言的零終止字符串。所以,你可以重複這樣的:

char c; 
int i = 0; 
const char *buffer = [nsstringInstance cStringUsingEncoding:NSASCIIStringEncoding]; 
while (c = buffer[i++]) { 
    // iterating using c char 

} 
+0

但是如果NSString包含非ASCII字符或長於1024個字符會怎麼樣?還要注意''-getCString:'從iOS2.0開始已被棄用。 – 2010-10-30 18:55:11

+0

@David:true。改爲cStringUsingEncoding。 – 2010-10-30 19:24:22

1

我不正常此判斷的,但目前的答案將工作...直到他們不這樣做!

只有在ObjC /基金會單一的方式來列舉實際的Unicode字符:使用使用的表情符號

NSStringEnumerationByComposedCharacterSequences 

這裏的問題是最好的說明選擇

- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block 

(Unicode名稱:POLE OF PO,代碼點:U + 1F4A9)當以UTF-16 Cocoa/Foundation/CoreFoundation在內部使用時表示爲0xD83DDCA9。使用其他方法您將得到兩個(損壞的,無效的)條目。

如果你的字符串很長,性能成爲問題,但內存不是,你可以使用UTF-32,你可以再次訪問你的角色在不斷的時間。只需將它們存儲在C數組或C++向量中即可。或者只是將32位值包裝在NSNumber中,並使用NSArray,如果性能不是那麼重要...

我強烈建議從objc.io issue#9通過NSString and Unicode進行閱讀。

編輯2016-05-15:在這種情況下,術語「字符」沒有明確定義,可能會產生誤導。我在上面稱之爲「字符」實際上是一個Unicode代碼點。斯威夫特在這裏做了正確的事情,並將角色定義爲「用戶認爲角色是什麼」。

相關問題