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)