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.

45
demandé sur DavidNorman 2015-04-24 01:10:14

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
68
répondu Leo Dabus 2018-07-17 15:43:54

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
10
répondu timgcarlson 2015-04-23 23:34:38
UnicodeScalar("1")!.value // returns 49

Swift 3.1

10
répondu Joe 2017-06-11 06:12:30

maintenant dans Xcode 7.1 et Swift 2.1

var singleChar = "a"

singleChar.unicodeScalars.first?.value
9
répondu wakeupsumo 2015-12-18 00:52:40

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.

3
répondu Sakiboy 2015-10-06 17:43:38

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
2
répondu matt 2015-04-23 23:18:24

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
}
2
répondu Airspeed Velocity 2015-04-24 01:00:39
var singchar = "a" as NSString

print(singchar.character(at: 0))

Swift 3.1

1
répondu Shauket Sheikh 2017-09-19 03:43:53

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"]

1
répondu rustyMagnet 2018-05-01 13:46:43

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.

0
répondu PJ_Finnegan 2018-01-16 12:36:20

Il y a aussi L'Uint8(ASCII: Unicode.Scalaire) initialiseur sur UInt8.

var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
0
répondu Anders 2018-01-25 05:51:07

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
0
répondu aios 2018-07-14 14:08:50