2013-05-31 12 views
17

W moim appJak ustalić, czy pierwszy znak z NSString jest list

muszę wiedzieć, czy pierwszy znak z ciągiem jest literą lub nie

Im uzyskiwanie pierwszego znaku ciąg taki jak ten

NSString *codeString; 
NSString *firstLetter = [codeString substringFromIndex:1]; 

Mogę go znać, porównując z a, b, c,. **.

if([firstLetter isEqualToString "a"] || ([firstLetter isEqualToString "A"] || ([firstLetter isEqualToString "b"] ......) 

Ale czy jest jeszcze jakaś inna metoda?

Potrzebuję wyświetlać różne kolory dla liter i symboli.

Jak mogę to osiągnąć w prosty sposób?

Odpowiedz

77

pierwsze, linia:

NSString *firstLetter = [codeString substringFromIndex:1]; 

nie dostać pierwszą literę. To daje ci nowy ciąg zawierający cały oryginalny ciąg Z WYJĄTKIEM pierwszego znaku. Jest to przeciwieństwo tego, co chcesz. Chcesz:

NSString *firstLetter = [codeString substringToIndex:1]; 

Ale jest lepszy sposób sprawdzenia, czy pierwszy znak jest literą czy nie.

unichar firstChar = [[codeString uppercaseString] characterAtIndex:0]; 
if (firstChar >= 'A' && char <= 'Z') { 
    // The first character is a letter from A-Z or a-z 
} 

Jednak, ponieważ aplikacje na iOS mają do czynienia z użytkownikami międzynarodowymi, dalekie od ideału jest po prostu szukanie postaci z liter A-Z. Lepszym rozwiązaniem byłoby:

unichar firstChar = [codeString characterAtIndex:0]; 
NSCharacterSet *letters = [NSCharacterSet letterCharacterSet]; 
if ([letters characterIsMember:firstChar]) { 
    // The first character is a letter in some alphabet 
} 

Jest kilka przypadków, w których to nie działa zgodnie z oczekiwaniami. unichar zawiera tylko 16-bitowe znaki. Jednak wartości NSString mogą zawierać w sobie 32-bitowe znaki. Przykłady obejmują wiele znaków Emoji. Jest więc możliwe, że ten kod może dać fałszywy alarm. Idealnie byłoby to zrobić:

NSRange first = [codeString rangeOfComposedCharacterSequenceAtIndex:0]; 
NSRange match = [codeString rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet] options:0 range:first]; 
if (match.location != NSNotFound) { 
    // codeString starts with a letter 
}   
Powiązane problemy