Je veux juste obtenir la valeur ASCII d’une chaîne de caractères unique dans Swift. Voici comment je le fais actuellement:
var singleChar = "a" println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
C’est si moche si. Il doit y avoir un moyen plus simple.
Vous pouvez créer une extension:
Xcode 9.4.1 • Swift 4.1 ou ultérieur
extension SsortingngProtocol { var ascii: [UInt32] { return unicodeScalars.compactMap { $0.isASCII ? $0.value : nil } } } extension Character { var ascii: UInt32? { return Ssortingng(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 le caractèreAtIndex de NSSsortingng pour accomplir ceci …
var singleCharSsortingng = "a" as NSSsortingng var singleCharValue = singleCharSsortingng.characterAtIndex(0) println("The value of \(singleCharSsortingng) is \(singleCharValue)") // The value of a is 97
Maintenant dans Xcode 7.1 et Swift 2.1
var singleChar = "a" singleChar.unicodeScalars.first?.value
UnicodeScalar("1")!.value // returns 49
Swift 3.1
Voici mon implémentation, il retourne un tableau des valeurs ASCII.
extension Ssortingng { func asciiValueOfSsortingng() -> [UInt32] { var retVal = [UInt32]() for val in self.unicodeScalars where val.isASCII() { retVal.append(UInt32(val)) } return retVal } }
Note: Oui, c’est compatible avec Swift 2.
La façon dont vous le faites est correcte. Si vous n’aimez pas la verbosité de l’indexation, vous pouvez l’éviter en parcourant les scalaires unicode:
var x : UInt32 = 0 let char = "a" for sc in char.unicodeScalars {x = sc.value; break}
Vous pouvez bien sûr omettre la break
dans ce cas, car il n’y a qu’un seul scalaire Unicode.
Ou, convertir en un tableau et utiliser l’indexation (le dernier recours du désespéré):
let char = "a" let x = Array(char.unicodeScalars)[0].value
Une façon un peu 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 réellement 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 NSSsortingng print(singchar.character(at: 0))
Swift 3.1
Swift 4.1
https://oleb.net/blog/2017/11/swift-4-ssortingngs/
let flags = "99_problems" flags.unicodeScalars.map { "\(Ssortingng($0.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])
Les deux impriment 99. Fonctionne pour n’importe quel caractère ASCII.
Il y a aussi l’initialiseur UInt8 (ascii: Unicode.Scalar) sur UInt8.
var singleChar = "a" UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
Swift 4.2
Le moyen le plus simple d’obtenir des valeurs ASCII à partir d’une chaîne Swift est ci-dessous
let str = "Swift ssortingng" for ascii in str.utf8 { print(ascii) }
Sortie:
83 119 105 102 116 32 115 116 114 105 110 103