2009-08-31 7 views
21

Próbowałem toLiczba znaków w NSString lub NSMutableString?

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString: myString]; 
[myCharSet count]; 

Ale dostać ostrzeżenie, że nie może odpowiedzieć NSCharacterSet liczyć. Dotyczy to aplikacji na komputery stacjonarne, a nie iPhone'a, z którymi, jak sądzę, działa powyższy kod.

+0

Aby wyjaśnić: chcesz liczbę unikalnych znaków w ciągu? –

+0

Nie - po prostu całkowita liczba znaków. – 4thSpace

Odpowiedz

76

I może być brakuje czegoś tutaj, ale co w tym złego po prostu robi:

NSUInteger characterCount = [myString length]; 

po prostu uzyskać liczbę znaków w ciągu, nie widzę żadnego powodu, aby poeksperymentować z NSCharacterSet.

+14

Po prostu, aby być czystym- '-length' zwraca' liczbę znaków Unicode w odbiorniku. (Zgodnie z definicją w dokumentacji 'NSString'). Z technicznego punktu widzenia dokumentacja jest błędna, ponieważ zwraca "liczbę jednostek kodu UTF-16", a nie "liczbę znaków Unicode". To rozróżnienie nie ma znaczenia dla większości programistów i zastosowań, ale ma ważne konsekwencje. Na przykład '[@" \ U0010ffff "length]' zwraca '2', nawet jeśli zawiera pojedynczy znak Unicode. 'characterAtIndex:' dla '0' i' 1' zwraca odpowiednio '0xdbff' i' 0xdfff'. – johne

+8

^Jest to NIEZWYKLE ważne, ponieważ obecnie większość użytkowników iOS używa emotikonów, które będą uważane za 2 znaki za pomocą wspomnianej powyżej metody "length" ... mimo że jest to 1 znak. –

+0

może to być ważniejsze niż można się spodziewać, jeśli używasz CoreData, zerwanie zastępczej pary jak "" nie powiedzie się przejściu zasady sprawdzania poprawności CoreData podczas fazy zatwierdzania, CoreData delikatnie pokazuje kod błędu 1671, który nawet google doesn Nic nie wiem o tym, co zajęło mi pół roku, aby dowiedzieć się, co się naprawdę dzieje :( – peak

0

To też nie powinno działać na iPhonie, ponieważ NSCharacterSet nie jest podklasą NSSet na żadnej platformie.

Jeśli naprawdę potrzebujesz, aby uzyskać liczbę, dlaczego nie podklasę NSSet, dodać wartość, a następnie mieć metodę, która zwraca to jako NSCharacterSet na żądanie do użycia we wszystkim, co wymaga zestawu znaków?

+0

NSSet jest klastrem klasy i dlatego nie jest łatwo (lub praktycznie) podklasy. –

+0

Czy nie istnieje prosta technika uzyskiwania liczby wszystkich znaków w ciągu znaków? – 4thSpace

+1

Tak, istnieje jedna (prawdziwa długość): [myString lengthOfBytesUsingEncoding: NSUTF32StringEncoding]/4; – Stephane