visual validar usuario teclado símbolos studio sistema saber regulares regular que para numeros number nombre net madrid letras iban guiones expresiones expresion especiales españa electronico ejemplos direccion definicion cuenta correo como codigos codigo code casa caracteres caja bic bankia banco asp alfanuméricos alfanumérico alfanumericos alfanumerico comparison character swift digits

comparison - validar - Cómo saber si la letra es alfanumérica o dígitos en Swift



teclado alfanumerico definicion (3)

Quiero contar el número de letras, dígitos y caracteres especiales en la siguiente cadena:

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

Lo intenté:

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

pero estoy recibiendo errores Intenté todo tipo de otras variaciones sobre esto, aún obteniendo errores, como por ejemplo:

no se pudo encontrar una sobrecarga para ''<='' que acepta los argumentos proporcionados


Creé una extensión corta para conteo de letras y dígitos para una String

extension String { var letterCount : Int { return self.unicodeScalars.filter({ CharacterSet.letters.contains($0) }).count } var digitCount : Int { return self.unicodeScalars.filter({ CharacterSet.decimalDigits.contains($0) }).count } }

o una función para obtener un conteo de cualquier CharacterSet que pones

extension String { func characterCount(for set: CharacterSet) -> Int { return self.unicodeScalars.filter({ set.contains($0) }).count } }

uso:

let phrase = "the final score is 23-13!" let letterCount = phrase.characterCount(for: .letters)


Usa los valores de 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)


Actualización para 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 } }

(Respuesta anterior para versiones antiguas de Swift)

Una posible solución Swift:

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

Actualización: la solución anterior solo funciona con caracteres en el conjunto de caracteres ASCII, es decir, no reconoce Ä, é o ø como letras. La siguiente solución alternativa usa NSCharacterSet de Foundation framework, que puede probar caracteres en función de sus clases de caracteres 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++ } }

Actualización 2: A partir de Xcode 6 beta 4, la primera solución ya no funciona, porque los isAlpha() y relacionados (solo ASCII) se han eliminado de Swift. La segunda solución aún funciona.