¿Cuál es la forma más sencilla de convertir de una Cadena de un solo carácter a un valor ASCII en Swift?

Solo quiero obtener el valor ASCII de una sola cadena de caracteres en Swift. Así es como lo estoy haciendo actualmente:

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

Aunque esto es muy feo. Debe haber una manera más simple.

Puedes crear una extensión:

Xcode 9.4.1 • Swift 4.1 o posterior

 extension StringProtocol { var ascii: [UInt32] { return unicodeScalars.compactMap { $0.isASCII ? $0.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 

Puede usar characterAtIndex de NSString para lograr esto …

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

Ahora en Xcode 7.1 y Swift 2.1

 var singleChar = "a" singleChar.unicodeScalars.first?.value 
 UnicodeScalar("1")!.value // returns 49 

Swift 3.1

Aquí está mi implementación, devuelve una matriz de valores ASCII.

 extension String { func asciiValueOfString() -> [UInt32] { var retVal = [UInt32]() for val in self.unicodeScalars where val.isASCII() { retVal.append(UInt32(val)) } return retVal } } 

Nota: Sí, es compatible con Swift 2.

La forma en que lo haces es correcta. Si no le gusta la verbosidad de la indexación, puede evitarla recorriendo los escalares Unicode:

 var x : UInt32 = 0 let char = "a" for sc in char.unicodeScalars {x = sc.value; break} 

En este caso, puede omitir la break en este caso, ya que solo hay un escalar unicode.

O bien, conviértase en una Matriz y use indexación Int (el último recurso de desesperación):

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

Una forma un poco más corta de hacer esto podría ser:

 first(singleChar.unicodeScalars)!.value 

Al igual que con la versión de subíndice, esto se bloqueará si su cadena está realmente vacía, por lo que si no está 100% seguro, use la opción:

 if let ascii = first(singleChar.unicodeScalars)?.value { } 

O, si quieres ser extra paranoico,

 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($0.value, radix: 16, uppercase: true))" } 

Resultado:

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

Swift 4

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

o

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

Ambos imprimen 99. Funciona para cualquier personaje ASCII.

También está el inicializador UInt8 (ascii: Unicode.Scalar) en UInt8.

 var singleChar = "a" UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex]) 

Swift 4.2

La forma más fácil de obtener valores ASCII de una cadena Swift está debajo

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

Salida:

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