Je veux juste convertir un caractère en Int.
Cela devrait être simple. Mais je n'ai pas trouvé les réponses précédentes utiles. Il y a toujours une erreur. C'est peut-être parce que je l'essaie dans Swift 2.0.
for i in (unsolved.characters) {
fileLines += String(i).toInt()
print(i)
}
Dans Swift 2.0, toInt()
, etc., ont été remplacés par des initialiseurs. (Dans ce cas, Int(someString)
.)
Parce que toutes les chaînes ne peuvent pas être converties en ints, cet initialiseur est disponible, ce qui signifie qu'il renvoie un optionnel int (Int?
) Au lieu d'un Int
. La meilleure chose à faire est de déballer cette option en utilisant if let
.
Je ne sais pas exactement ce que vous cherchez, mais ce code fonctionne en Swift 2, et accomplit ce que je pense que vous essayez de faire:
let unsolved = "123abc"
var fileLines = [Int]()
for i in unsolved.characters {
let someString = String(i)
if let someInt = Int(someString) {
fileLines += [someInt]
}
print(i)
}
Ou, pour une solution plus rapide:
let unsolved = "123abc"
let fileLines = unsolved.characters.filter({ Int(String($0)) != nil }).map({ Int(String($0))! })
// fileLines = [1, 2, 3]
Vous pouvez raccourcir davantage ceci avec flatMap
:
let fileLines = unsolved.characters.flatMap { Int(String($0)) }
flatMap
renvoie "un Array
contenant les résultats non nuls du mappage transform
sur self
"… donc quand Int(String($0))
est nil
, le résultat est rejeté.
C'est un truc d'improvisation que j'ai trouvé. Puisqu'il peut être difficile de convertir Character
en Int
, mais vous pouvez facilement convertir String
en Int
faites ceci:
fileLines = Int(String(i))!
bien sûr ce n'est pas très bien optimisé mais pour des cas comme le vôtre ça peut faire l'affaire.
Réellement. Un moyen plus simple consiste à convertir String en Int en Swift 2.o est:
let chars = Int(chars)
Je ne sais pas si c'est ce que vous essayez ... Mais vous pouvez facilement l'appliquer à votre boucle, bien sûr.
Solutions Swift 4
Pour convertir un Character
en String
:
let digit = Int(String("1"))!
//Don't force unwrap this if you're not 100% sure your character is a digit
Solution au problème des PO:
let fileLines = unsolved.compactMap{ Int(String($0) }
// fileLines = [1, 2, 3]
Dans les dernières versions Swift (au moins dans Swift 5), vous n'avez pas besoin d'effectuer de conversion supplémentaire en String
).
Character
a la propriété wholeNumberValue
qui essaie de convertir un caractère en Int
et renvoie nil
si le caractère ne représente pas et n'est pas un entier.
let char: Character = "5"
if let intValue = char.wholeNumberValue {
print("Value is \(intValue)")
} else {
print("Not an integer")
}