2013-05-31 3 views
17

In meiner appWie zu bestimmen, ob das erste Zeichen eines NSString ein Brief ist

Ich muss wissen, ob die erste Zeichen einer Zeichenkette ein Brief ist oder nicht

Im ersten Zeichen des Erhaltens die Zeichenfolge wie diese

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

Ich kann es durch den Vergleich mit a, b, c, kennen. **.

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

Aber gibt es eine andere Methode zu wissen?

Ich muss verschiedene Farben für Buchstaben und Symbole anzeigen.

Wie kann ich es auf einfache Weise erreichen?

Antwort

77

First off, Ihre Linie:

NSString *firstLetter = [codeString substringFromIndex:1]; 

nicht den ersten Buchstaben bekommen. Dies gibt Ihnen eine neue Zeichenfolge, die den gesamten ursprünglichen String EXCEPT das erste Zeichen enthält. Dies ist das Gegenteil von dem, was Sie wollen. Sie wollen:

NSString *firstLetter = [codeString substringToIndex:1]; 

Aber es gibt einen besseren Weg, um zu sehen, wenn das erste Zeichen ein Buchstabe ist oder nicht.

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

Da jedoch iOS Deal mit internationalen Nutzern apps, ist es bei weitem nicht ideal einfach für den Charakter in den Buchstaben A-Z ist, zu suchen. Ein besserer Ansatz wäre:

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

Es gibt ein paar Fälle, in denen dies nicht wie erwartet funktioniert. unichar enthält nur 16-Bit-Zeichen. Aber NSString Werte können tatsächlich einige 32-Bit-Zeichen enthalten. Beispiele umfassen viele Emoji-Zeichen. Es ist also möglich, dass dieser Code ein falsches positives Ergebnis liefert. Idealerweise möchten Sie dies tun:

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