web-dev-qa-db-fra.com

Comment savoir si une lettre est alphanumérique ou numérique dans Swift

Je veux compter le nombre de lettres, de chiffres et de caractères spéciaux dans la chaîne suivante:

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

J'ai essayé:

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

mais je reçois des erreurs. J'ai essayé toutes sortes d'autres variantes à ce sujet - toujours des erreurs - telles que:

impossible de trouver une surcharge pour '<=' qui accepte les arguments fournis

33
sirab333

Mise à jour pour 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
    }
}

(Réponse précédente pour les anciennes versions de Swift)

Une solution Swift possible:

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: La solution ci-dessus ne fonctionne qu'avec les caractères du jeu de caractères ASCII, , C'est-à-dire. il ne reconnaît pas les lettres Ä, é ou ø. L'alternative suivante Solution utilise NSCharacterSet à partir du framework Foundation, qui peut tester les caractères En fonction de leurs classes de caractères 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++
    }
}

Mise à jour 2: À partir de Xcode 6 beta 4, la première solution ne fonctionne plus car La méthode isAlpha() et les méthodes associées (en ASCII uniquement) ont été supprimées de Swift . La deuxième solution fonctionne toujours .

52
Martin R

Utilisez les valeurs 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)
4
Yao

J'ai créé une courte extension pour la lettre et les chiffres comptent pour 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
  }
}

ou une fonction pour obtenir un compte pour toute CharacterSet que vous avez mise en

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

usage:

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