data string swift cocoa nsdata

string - Cómo inicializar una cadena desde NSData en Swift



string to data swift 4 (7)

He estado tratando de inicializar una cadena de NSData en Swift.

En la documentación NSString Cocoa, Apple dice que debes usar esto:

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

Sin embargo, Apple no incluyó ningún ejemplo de uso o dónde colocar el init .

Estoy tratando de convertir el siguiente código de Objective-C a Swift

NSString *string; string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

He estado probando muchas sintaxis posibles, como la siguiente (por supuesto, no funcionó):

var string:NSString! string = init(data: fooData,encoding: NSUTF8StringEncoding)


Swift 2.0

Parece que Swift 2.0 realmente ha introducido el String(data:encoding:) como una extensión de cadena cuando importas Foundation . No he encontrado ningún lugar donde esto esté documentado, extrañamente.

(pre Swift 2.0) Extensión ligera

Aquí hay una pequeña extensión para copiar y pegar sin usar NSString , cortemos al intermediario.

import Foundation extension NSData { var byteBuffer : UnsafeBufferPointer<UInt8> { get { return UnsafeBufferPointer<UInt8>(start: UnsafeMutablePointer<UInt8>(self.bytes), count: self.length) }} } extension String { init?(data : NSData, encoding : NSStringEncoding) { self.init(bytes: data.byteBuffer, encoding: encoding) } } // Playground test let original = "Nymphs blitz quick vex dwarf jog" let encoding = NSASCIIStringEncoding if let data = original.dataUsingEncoding(encoding) { String(data: data, encoding: encoding) }

Esto también le da acceso a data.byteBuffer que es un tipo de secuencia, por lo que todas las operaciones geniales que puede hacer con secuencias también funcionan, como hacer una reduce { $0 &+ $1 } para una suma de comprobación.

Notas

En mi edición anterior, utilicé este método:

var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00) data.getBytes(&buffer, length: data.length) self.init(bytes: buffer, encoding: encoding)

El problema con este enfoque es que estoy creando una copia de la información en una nueva matriz, por lo tanto, estoy duplicando la cantidad de bytes (específicamente: encoding size * data.length )


Así es como debe inicializar NSString :

Swift 2.X o más viejo

let datastring = NSString(data: fooData, encoding: NSUTF8StringEncoding)

Swift 3 o más nuevo:

let datastring = NSString(data: fooData, encoding: String.Encoding.utf8.rawValue)

Este documento explica la sintaxis.


C objetivo

NSData *myStringData = [@"My String" dataUsingEncoding:NSUTF8StringEncoding]; NSString *myStringFromData = [[NSString alloc] initWithData:myStringData encoding:NSUTF8StringEncoding]; NSLog(@"My string value: %@",myStringFromData);

Rápido

//This your data containing the string let myStringData = "My String".dataUsingEncoding(NSUTF8StringEncoding) //Use this method to convert the data into String let myStringFromData = String(data:myStringData!, encoding: NSUTF8StringEncoding) print("My string value:" + myStringFromData!)

http://objectivec2swift.blogspot.in/2016/03/coverting-nsdata-to-nsstring-or-convert.html


Desde la tercera versión de Swift puedes hacer lo siguiente:

let desiredString = NSString(data: yourData, encoding: String.Encoding.utf8.rawValue)

similar a lo que Sunkas aconsejó.


Este es el código implementado que se necesita:

en Swift 3.0:

var dataString = String(data: fooData, encoding: String.Encoding.utf8)

o solo

var dataString = String(data: fooData, encoding: .utf8)

Versión anterior más rápida:

en Swift 2.0:

import Foundation var dataString = String(data: fooData, encoding: NSUTF8StringEncoding)

en Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)


Otra respuesta basada en extensiones (chico, echo de menos esto en Java):

extension NSData { func toUtf8() -> String? { return String(data: self, encoding: NSUTF8StringEncoding) } }

Entonces puedes usarlo:

let data : NSData = getDataFromEpicServer() let string : String? = data.toUtf8()

Tenga en cuenta que la cadena es opcional, el NSData inicial puede no convertirse en Utf8.


import Foundation var string = NSString(data: NSData?, encoding: UInt)