Crear NSData desde NSString en Swift

174

En última instancia, estoy tratando de tener un valor NSMutableURLRequestválido HTTPBody, pero parece que no puedo obtener mis datos de cadena (procedentes de a UITextField) en un NSDataobjeto utilizable .

He visto este método para ir hacia otro lado:

NSString(data data: NSData!, encoding encoding: UInt)

Pero parece que no puedo encontrar ninguna documentación para mi caso de uso. Estoy dispuesto a poner la cadena en otro tipo si es necesario, pero ninguna de las opciones de inicialización para NSDatausar Swift parece ser lo que estoy buscando.

Jackson Egan
fuente

Respuestas:

359

En Swift 3

let data = string.data(using: .utf8)

En Swift 2 (o si ya tienes una NSStringinstancia)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

En Swift 1 (o si tiene un swift String):

let data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding)

También tenga en cuenta que dataes un Optional<NSData>(ya que la conversión puede fallar), por lo que deberá desenvolverla antes de usarla, por ejemplo:

if let d = data {
    println(d)
}
Gabriele Petronella
fuente
Swift puede inferir el tipo NSData?
Nicolas Manzini
@NicolasManzini seguro que puede, como con cualquier otro tipo.
Gabriele Petronella
2
@macdonjo sí, esa API cambió con el tiempo y ahora devuelve un Optional<NSData>, que debes desenvolver antes de usar
Gabriele Petronella
3
En Swift2, no hay necesidad de usar el reparto "como" ya que se puentea automáticamente
Jacky
1
Una conversión a UTF-8 no puede fallar, por lo tanto, un enlace opcional que realmente no es necesario, puede forzar el desenrollado aquí.
Martin R
33

Swift 4 y 3

La creación de Dataobjetos a partir de Stringobjetos se ha cambiado en Swift 3. La versión correcta ahora es:

let data = "any string".data(using: .utf8)
Dijo Sikira
fuente
Gracias. Esto funcionó para mí en Swift 3 perfectamente. let input = "cadena de prueba" let xdata = input.data (usando: String.Encoding.utf8)
raddevus
1
¿Alguna idea de por qué String (data: data !, codificación: .nonLossyASCII) será nula?
Happiehappie
4

Aquí un método muy simple

let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
Shafraz Buhary
fuente
4

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
jatin
fuente
No lo use NSStringen Swift.
vadiano
3
// Checking the format
var urlString: NSString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)

// Convert your data and set your request's HTTPBody property
var stringData: NSString = NSString(string: "jsonRequest=\(urlString)")

var requestBodyData: NSData = stringData.dataUsingEncoding(NSUTF8StringEncoding)!
Vinod Joshi
fuente
2

Para crear datos no opcionales, recomiendo usarlos:

let key = "1234567"
let keyData = Data(key.utf8)
Ramis
fuente
1
En Swift 3+ esta es la forma más eficiente.
vadiano
2

Swift 4.2

let data = yourString.data(using: .utf8, allowLossyConversion: true)
meMadhav
fuente
2

En Swift 5

let data = Data(YourString.utf8)
Sanjay Mishra
fuente
0

Convertir cadena a datos

extension String {
    func toData() -> Data {
        return Data(self.utf8)
    }
}

Convertir datos a cadenas

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
Sumit
fuente