Cómo inicializar una cadena desde NSData en Swift

173

He estado tratando de inicializar una cadena de NSData Swift.

En la documentación de NSString Cocoa, Apple dice que debe 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 las siguientes (por supuesto, no funcionó):

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

Respuestas:

224

Así es como debe inicializar NSString:

Swift 2.X o mayor

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

Swift 3 o más reciente:

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

Este documento explica la sintaxis.

67 cerezas
fuente
2
Tenga en cuenta que no necesita repetir "datos" y "codificación" de esa manera.
jbg
19
Debería serlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
¿Es posible convertir NSDatadirectamente en un Swift String(en lugar de un NSString)?
ma11hew28
3
@MattDiPasquale var swiftString = NSString (datos: NSData !, codificación: UInt) como! Cadena, eso es todo
Gintama
11
@MattDiPasquale Ignora el lanzamiento forzado anterior; Stringes un NSString... todo esto debería ser:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Este es el código implementado necesario:

en Swift 3.0:

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

o solo

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

Versión rápida anterior:

en Swift 2.0:

import Foundation

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

en Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
fuente
Swift 2 tiene una forma diferente de hacerlo
Departamento B el
3
También se agregó una versión Swift 2.0 ahora
Sunkas
¿Conocerías la forma Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'
2
También se agregó una versión de Swift 3.0. ¡Maldita sea, a Apple le gusta cambiar cosas!
Sunkas
1
Debe compilar en una versión específica de Swift, por lo que su código se escribirá en 2.xo 3.x. Además, tenga en cuenta que con la versión 3.0 puede acortarla usando var dataString = String(data: fooData, encoding: .utf8).
ruttopia
15

Swift 2.0

Parece que Swift 2.0 ha introducido la String(data:encoding:)extensión String cuando importa Foundation. No he encontrado ningún lugar donde esto esté documentado, por extraño que parezca.

(pre Swift 2.0) Extensión ligera

Aquí hay una pequeña extensión que se puede 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.byteBuffercuál es un tipo de secuencia, por lo que todas esas operaciones interesantes que puede hacer con secuencias también funcionan, como hacer unreduce { $0 &+ $1 } una suma de verificació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 duplicar la cantidad de bytes (en concreto: encoding size * data.length)

Poder
fuente
4

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 aconsejó Sunkas.

Sergey Petrachkov
fuente
3
import Foundation
var string = NSString(data: NSData?, encoding: UInt)
matraz
fuente
2

Otra respuesta basada en extensiones (chico, extraño 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, la inicial NSDatapuede no ser convertible a Utf8.

elcuco
fuente
0

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

Tarun Seera
fuente