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!"
}
}
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.
Vous devez utiliser les fonctions de plage intégrées String
s 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 Sequence
s. 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é.
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")
}