Quelle est la façon la plus simple de passer d'une chaîne de caractères à une valeur ASCII dans Swift?
je veux juste obtenir la valeur ASCII d'une seule chaîne de caractères dans Swift. C'est de cette façon que je suis en train de faire:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
C'est si laid. Il doit y avoir un moyen plus simple.
12 réponses
Vous pouvez créer une extension:
Xcode 9.4.1 • Swift 4.1 ou une version plus récente
extension StringProtocol {
var ascii: [UInt32] {
return unicodeScalars.compactMap { .isASCII ? .value : nil }
}
}
extension Character {
var ascii: UInt32? {
return String(self).ascii.first
}
}
Character("a").ascii // 97
Character("á").ascii // nil
"abc".ascii // [97, 98, 99]
"abc".ascii[0] // 97
"abc".ascii[1] // 98
"abc".ascii[2] // 99
Vous pouvez utiliser Nsstring's characterAtIndex pour accomplir cette tâche...
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
maintenant dans Xcode 7.1 et Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
Voici mon implémentation, il renvoie un tableau des valeurs ASCII.
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
Note: Oui C'est compatible Swift 2.
La façon dont vous le faites est juste. Si vous n'aimez pas la verbosité de l'indexation, vous pouvez l'éviter en faisant du vélo à travers les scalars unicode:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
Vous pouvez effectivement omettre l'
Ou, convertir un Tableau et utiliser Int indexation (le dernier recours de l'désespéré):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
une façon légèrement plus courte de le faire pourrait être:
first(singleChar.unicodeScalars)!.value
comme avec la version en indice, cela va planter si votre chaîne est vide, donc si vous n'êtes pas sûr à 100%, utilisez l'option:
if let ascii = first(singleChar.unicodeScalars)?.value {
}
Ou, si vous voulez être extra-paranoïaque,
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
Swift 4.1
https://oleb.net/blog/2017/11/swift-4-strings/
let flags = "99_problems"
flags.unicodeScalars.map {
"\(String(.value, radix: 16, uppercase: true))"
}
Résultat:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
Swift 4
print("c".utf8["c".utf8.startIndex])
ou
let cu = "c".utf8
print(cu[cu.startIndex])
tous les deux Imprimez 99. Fonctionne pour n'importe quel caractère ASCII.
Il y a aussi L'Uint8(ASCII: Unicode.Scalaire) initialiseur sur UInt8.
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
Swift 4.2
la façon la plus facile d'obtenir des valeurs ASCII à partir d'une chaîne Swift est
let str = "Swift string"
for ascii in str.utf8 {
print(ascii)
}
Sortie:
83
119
105
102
116
32
115
116
114
105
110
103