2014-07-01 26 views
29

Chcę policzyć liczbę liter, cyfr i znaków specjalnych w następujący ciąg:Swift: jak dowiedzieć się, czy list jest alfanumeryczny lub Digit

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

ja próbowałem:

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

ale dostaję błędy. Próbowałem różnych odmian tego - nadal otrzymuję błąd - takich jak:

could not find an overload for '<=' that accepts the supplied arguments 

Jakieś wskazówki?

Odpowiedz

45

Możliwym Swift rozwiązanie:

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++ 
    } 
} 

Aktualizacja: Powyższe rozwiązanie działa tylko z postaciami z zestawu znaków ASCII, to znaczy, że nie rozpoznaje A, E lub O jako litery. Poniższy Alternatywnym rozwiązaniem wykorzystuje NSCharacterSet z ram Fundacji, która może sprawdzić wygląd znaków na podstawie swoich klas znaków Unicode:

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: Od Xcode 6 beta 4, pierwsze rozwiązanie nie nie działa, ponieważ metody isAlpha() i pokrewne (tylko ASCII) zostały usunięte z Swift. Drugie rozwiązanie nadal działa.


Aktualizacja 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

Tak, to idealna - jak do cholery się dowiedziałeś o "isalpha" i " isDigit "????? :-) Nie wiedziałem nawet, że istnieją. (Poważnie - czy sprawdziłeś je, czy też już do nich dotarłeś w poprzednich podróżach?) – sirab333

+0

@ sirab333: 'isalpha()' i przyjaciele są dobrze znani w C, zobacz np. https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/ctype.3.html#//apple_ref/doc/man/3/ctype. Tak więc miałem "tylko", aby dowiedzieć się, jak korzystać z nich od Swift. - Ale pamiętaj, że działa to tylko dla znaków ASCII. Nie rozpoznaje liter z "języków obcych", takich jak "ä", "è" lub "ø". –

+0

i rozpoznaje '+' i '-' jako cyfrę –

4

Wykorzystanie wartości 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)