web-dev-qa-db-fra.com

Comment puis-je vérifier si une chaîne contient des lettres dans Swift?

J'essaie de vérifier si une chaîne spécifique contient des lettres ou non.

Jusqu'à présent, j'ai rencontré NSCharacterSet.letterCharacterSet() comme un ensemble de lettres, mais j'ai du mal à vérifier si un caractère de cet ensemble se trouve dans la chaîne donnée. Lorsque j'utilise ce code, j'obtiens une erreur indiquant:

"Personnage" n'est pas convertible en "unichar"

Pour le code suivant:

for chr in input{
    if letterSet.characterIsMember(chr){
        return "Woah, chill out!"
    }
}
23
qmlowery

Vous pouvez utiliser NSCharacterSet de la manière suivante:

let letters = NSCharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: characterSet)

// range will be nil if no letters is found
if let test = range {
    println("letters found")
}
else {
   println("letters not found")
}

Ou vous pouvez aussi le faire:

func containsOnlyLetters(input: String) -> Bool {
   for chr in input {
      if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
         return false
      }
   }
   return true
}

Dans Swift 2:

func containsOnlyLetters(input: String) -> Bool {
   for chr in input.characters {
      if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
         return false
      }
   }
   return true
}

À vous de choisir, choisissez un moyen. J'espère que cela vous aidera.

42
Victor Sigler

Vous devez utiliser les fonctions de plage intégrées Strings avec NSCharacterSet plutôt que de lancer votre propre solution. Cela vous donnera également beaucoup plus de flexibilité (comme la recherche insensible à la casse si vous le souhaitez).

let str = "Hey this is a string"
let characterSet = NSCharacterSet(charactersInString: "aeiou")

if let _ = str.rangeOfCharacterFromSet(characterSet, options: .CaseInsensitiveSearch) {
    println("true")
}
else {
    println("false")
}

Remplacer "aeiou" avec les lettres que vous recherchez.

Une solution moins flexible, mais amusante Swift remarque tout de même, est que vous pouvez utiliser l’une des fonctions disponibles pour Sequences. Vous pouvez donc le faire:

contains("abc", "c")

Bien sûr, cela ne fonctionnera que pour des personnages individuels, et n'est pas flexible et n'est pas recommandé.

7
Jarsen

Le problème avec .characterIsMember est qu'il faut un unichar (un typealias pour UInt16).

Si vous répétez votre entrée en utilisant le utf16 vue de la chaîne, cela fonctionnera:

let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
    if set.characterIsMember(chr) {
        println("\(chr) is a letter")
    }
}

Vous pouvez également ignorer la boucle et utiliser l'algorithme contains si vous souhaitez uniquement vérifier la présence/non-présence:

if contains(input.utf16, { set.characterIsMember($0) }) {
    println("contains letters")
}
4