所以我有一個方法,需要一個NSString作爲參數,我希望該方法基本上分解成單個字符並將它們存儲在一個數組(NSArray)中。我會如何將NSString分解爲單個字符?
I other words我想讀取字符串中的每個字符,並按照相同的順序將各個字符存儲在一個數組中,以便我可以在稍後處理單個字符。
有什麼想法?
所以我有一個方法,需要一個NSString作爲參數,我希望該方法基本上分解成單個字符並將它們存儲在一個數組(NSArray)中。我會如何將NSString分解爲單個字符?
I other words我想讀取字符串中的每個字符,並按照相同的順序將各個字符存儲在一個數組中,以便我可以在稍後處理單個字符。
有什麼想法?
遍歷字符串,使用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];
}
除了布拉德回答(在那裏他展示了每個角色當然存儲在NSArray
例如,如果你想要的),你也有更直接的機會得到NSString
值作爲一個普通的老C語言的零終止字符串。所以,你可以重複這樣的:
char c;
int i = 0;
const char *buffer = [nsstringInstance cStringUsingEncoding:NSASCIIStringEncoding];
while (c = buffer[i++]) {
// iterating using c char
}
但是如果NSString包含非ASCII字符或長於1024個字符會怎麼樣?還要注意''-getCString:'從iOS2.0開始已被棄用。 – 2010-10-30 18:55:11
@David:true。改爲cStringUsingEncoding。 – 2010-10-30 19:24:22
我不正常此判斷的,但目前的答案將工作...直到他們不這樣做!
只有在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代碼點。斯威夫特在這裏做了正確的事情,並將角色定義爲「用戶認爲角色是什麼」。
是的好點,我不妨像過去一樣過程。非常感謝,我會試一試。 – cgossain 2010-10-30 18:42:30
更正:1)它是'unichar' 2)[[NSMutableArray alloc] initWithCapacity:'將使用默認的分配器。默認的分配器假設'id',並且將發送保留/釋放消息給unichars - 當然這會崩潰。你有兩個選擇:對每個字符使用NSString,或者下拉使用自定義分配器分配一個CFMutableArray,該分配器不對unichars執行引用計數 – justin 2010-10-30 18:45:07
@Justin - 謝謝,是的,你的權利。 NSArray是一個事後的想法 - 因爲,正如我所建議的,他甚至不需要它。 – Brad 2010-10-30 18:48:29