2014-07-01 10 views
29

ich die Anzahl der Buchstaben, Ziffern und Sonderzeichen in der folgenden Zeichenfolge zählen möchten:Swift: Wie um herauszufinden, ob Brief alphanumerische oder Digit

let phrase = "The final score was 32-31!" 

Ich habe versucht:

for tempChar in phrase { 
    if (tempChar >= "a" && tempChar <= "z") { 
     letterCounter++ 
    } 
// etc. 

aber ich bekomme Fehler. Ich habe versucht, alle möglichen anderen Variationen über diese - immer noch Fehler - wie zum Beispiel:

Irgendwelche Hinweise?

Antwort

45

Eine mögliche Swift Lösung:

var letterCounter = 0 
var digitCount = 0 
let phrase = "The final score was 32-31!" 
for tempChar in phrase.unicodeScalars { 
    if tempChar.isAlpha() { 
     letterCounter++ 
    } else if tempChar.isDigit() { 
     digitCount++ 
    } 
} 

Update: Die obige Lösung nur mit Zeichen im ASCII-Zeichensatz arbeitet, heißt es nicht A, E oder ø als Buchstaben erkennen. Die folgende alternative Lösung NSCharacterSet aus der Stiftung Framework verwendet, die Zeichen basierend auf ihren Unicode-Zeichenklassen testen können:

let letters = NSCharacterSet.letterCharacterSet() 
let digits = NSCharacterSet.decimalDigitCharacterSet() 

var letterCount = 0 
var digitCount = 0 

for uni in phrase.unicodeScalars { 
    if letters.longCharacterIsMember(uni.value) { 
     letterCount++ 
    } else if digits.longCharacterIsMember(uni.value) { 
     digitCount++ 
    } 
} 

Update 2: Ab Xcode 6 Beta 4 ist die erste Lösung tut funktioniert nicht mehr, weil die isAlpha() und verwandte (nur ASCII) Methoden aus Swift entfernt wurden. Die zweite Lösung funktioniert noch.


Update für Swift 3:

let letters = CharacterSet.letters 
let digits = CharacterSet.decimalDigits 

var letterCount = 0 
var digitCount = 0 

for uni in phrase.unicodeScalars { 
    if letters.contains(uni) { 
     letterCount += 1 
    } else if digits.contains(uni) { 
     digitCount += 1 
    } 
} 
+0

Yep, das ist perfekt - wie zum Teufel Sie über "isalpha" aufmerksam geworden und " isDigit "????? :-) Ich wusste gar nicht, dass es diese gab. (Ernsthaft - hast du sie aufgesucht oder warst du schon auf früheren Reisen?) – sirab333

+0

@ sirab333: 'isalpha()' und Freunde sind in C gut bekannt, siehe z. https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/ctype.3.html#//apple_ref/doc/man/3/ctype. Also musste ich "nur" herausfinden, wie man sie von Swift benutzt. - Beachten Sie, dass dies nur für ASCII-Zeichen funktioniert. Es erkennt keine Buchstaben aus "Fremdsprachen" wie "ä", "è" oder "ø". –

+0

und es erkennt '+' und '-' als Ziffer –

4

Verwenden Sie die Werte von unicodeScalars

let phrase = "The final score was 32-31!" 
var letterCounter = 0, digitCounter = 0 
for scalar in phrase.unicodeScalars { 
    let value = scalar.value 
    if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {++letterCounter} 
    if (value >= 48 && value <= 57) {++digitCounter} 
} 
println(letterCounter) 
println(digitCounter)