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.