web-dev-qa-db-fra.com

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

Je veux juste obtenir la valeur ASCII d'une seule chaîne de caractères dans Swift. Voici comment je le fais actuellement:

var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97

C'est si moche cependant. Il doit y avoir un moyen plus simple.

50
DavidNorman

Vous pouvez créer une extension:

Swift 4 ou plus tard

extension Character {
    var isAscii: Bool {
        return unicodeScalars.first?.isASCII == true
    }
    var ascii: UInt32? {
        return isAscii ? unicodeScalars.first?.value : nil
    }
}

extension StringProtocol {
    var ascii: [UInt32] {
        return compactMap { $0.ascii }
    }
}

Character("a").isAscii  // true
Character("a").ascii    // 97

Character("á").isAscii  // false
Character("á").ascii    // nil

"abc".ascii            // [97, 98, 99]
"abc".ascii[0]         // 97
"abc".ascii[1]         // 98
"abc".ascii[2]         // 99
78
Leo Dabus
UnicodeScalar("1")!.value // returns 49

Swift 3.1

12
Joe

Maintenant dans Xcode 7.1 et Swift 2.1

var singleChar = "a"

singleChar.unicodeScalars.first?.value
10
wakeupsumo

Vous pouvez utiliser characterAtIndex de NSString pour y parvenir ...

var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)")  // The value of a is 97
10
timgcarlson

Voici mon implémentation, elle retourne 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
    }
}

Remarque: oui, il est compatible Swift 2.

3
Sakiboy

Une façon un peu plus courte de faire cela pourrait être:

first(singleChar.unicodeScalars)!.value

Comme avec la version en indice, cela plantera si votre chaîne est réellement vide. Si vous n’êtes pas sûr à 100%, utilisez l’option facultative:

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
}
3
Airspeed Velocity

Swift 4.1

https://oleb.net/blog/2017/11/Swift-4-strings/

let flags = "99_problems"
flags.unicodeScalars.map {
    "\(String($0.value, radix: 16, uppercase: true))"
}

Résultat:

["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]

2
rustyMagnet

Swift 4.2

Le moyen le plus simple d'obtenir les valeurs ASCII d'une chaîne Swift est ci-dessous

let str = "Swift string"
for ascii in str.utf8 {
    print(ascii)
}

Sortie: 

83
119
105
102
116
32
115
116
114
105
110
103
2
aios

La façon dont vous le faites est juste. 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}

Dans ce cas, vous pouvez bien sûr omettre la variable break, car il n’existe qu’un seul scalaire unicode.

Ou bien, convertissez-vous en un tableau et utilisez l'indexation Int (le dernier recours du désespéré):

let char = "a"
let x = Array(char.unicodeScalars)[0].value
2
matt

Il y a aussi l'initialiseur UInt8 (ascii: Unicode.Scalar) sur UInt8.

var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
1
Anders
var singchar = "a" as NSString

print(singchar.character(at: 0))

Swift 3.1

1
Shauket Sheikh

Swift 4+

Char en ASCII

let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value

ASCII à Char

let char = Character(UnicodeScalar(asciiVal)!)
0
Mohit Kumar

Swift 4

print("c".utf8["c".utf8.startIndex])

ou

let cu = "c".utf8
print(cu[cu.startIndex])

Les deux imprimer 99. Fonctionne pour tout caractère ASCII.

0
PJ_Finnegan

Avec Swift 5, vous pouvez choisir l’une des approches suivantes pour obtenir la représentation numérique ASCII d’un caractère.


#1. Utilisation de la propriété Character's asciiValue

Character a une propriété appelée asciiValue . asciiValue a la déclaration suivante:

var asciiValue: UInt8? { get }

La valeur de codage ASCII de ce caractère, s'il s'agit d'un caractère ASCII.

Les exemples de code suivants de Playground montrent comment utiliser asciiValue afin d'obtenir La valeur de codage ASCII d'un caractère:

let character: Character = "a"
print(character.asciiValue) //prints: Optional(97)
let string = "a"
print(string.first?.asciiValue) //prints: Optional(97)
let character: Character = "????"
print(character.asciiValue) //prints: nil

# 2. Utilisation de la propriété Character 's isASCII et de la propriété Unicode.Scalar' s value

Sinon, vous pouvez vérifier que le premier caractère d'une chaîne est un caractère ASCII (en utilisant Character 's isASCII property), puis obtenir la représentation numérique de son premier scalaire Unicode (en utilisant Unicode.Scalar's value propriété). L'exemple de code Playground ci-dessous montre comment procéder:

let character: Character = "a"
if character.isASCII, let scalar = character.unicodeScalars.first {
    print(scalar.value)
} else {
    print("Not an ASCII character")
}
/*
 prints: 97
 */
let string = "a"
if let character = string.first, character.isASCII, let scalar = character.unicodeScalars.first {
    print(scalar.value)
} else {
    print("Not an ASCII character")
}
/*
 prints: 97
 */
let character: Character = "????"
if character.isASCII, let scalar = character.unicodeScalars.first {
    print(scalar.value)
} else {
    print("Not an ASCII character")
}
/*
 prints: Not an ASCII character
 */
0
Imanou Petit