Quelle est la manière la plus simple de convertir une chaîne de caractères unique en une valeur ASCII dans Swift?

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