Como inicializar uma string do NSData no Swift

173

Eu tenho tentado inicializar uma string NSDatano Swift.

Na documentação do NSString Cocoa, a Apple está dizendo que você deve usar isto:

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

No entanto, a Apple não incluiu nenhum exemplo de uso ou onde colocá-lo init.

Estou tentando converter o seguinte código de Objective-C para Swift

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

Eu tenho tentado muitas sintaxes possíveis, como as seguintes (é claro que não funcionou):

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

Respostas:

224

É assim que você deve inicializar o NSString:

Swift 2.X ou mais antigo

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

Swift 3 ou mais recente:

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

Este documento explica a sintaxe.

67cherries
fonte
2
Observe que você não precisa repetir “dados” e “codificação” assim.
jbg
19
Deve serlet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.
14
É possível converter NSDatadiretamente em um Swift String(em vez de um NSString)?
Ma11hew28
3
@MattDiPasquale var swiftString = NSString (dados: NSData !, codificação: UInt) as! Cadeia de caracteres que é tudo
Gintama
11
@MattDiPasquale Ignore o elenco forçado acima; Stringé uma NSString... tudo isso deve ser:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond
278

Este é o código implementado necessário:

no Swift 3.0:

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

ou apenas

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

Versão rápida mais antiga:

no Swift 2.0:

import Foundation

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

no Swift 1.0:

var dataString = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Sunkas
fonte
Swift 2 tem uma maneira diferente de fazer isso
Departamento B
3
Adicionada também uma versão do Swift 2.0
Sunkas
Você conhecia a maneira Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias'
2
Também foi adicionada uma versão do Swift 3.0. Droga, a Apple gosta de mudar coisas!
Sunkas
1
Você precisa compilar com uma versão específica do Swift, para que todo o seu código seja gravado na versão 2.x ou 3.x. Além disso, observe que na versão 3.0 você pode reduzi-la usando var dataString = String(data: fooData, encoding: .utf8).
Ruttopia
15

Swift 2.0

Parece que o Swift 2.0 realmente introduziu a String(data:encoding:)extensão como String quando você importa Foundation. Não encontrei nenhum lugar onde isso esteja documentado, por incrível que pareça.

(pré Swift 2.0) Extensão leve

Aqui está uma pequena extensão que pode ser copiada sem usar NSString, vamos cortar o intermediário.

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)
}

Isso também fornece acesso a data.byteBufferum tipo de sequência, para que todas as operações legais que você pode realizar com sequências também funcionem, como fazer um reduce { $0 &+ $1 }para uma soma de verificação.

Notas

Na minha edição anterior, usei este método:

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

O problema com essa abordagem é que estou criando uma cópia das informações em uma nova matriz, portanto, estou duplicando a quantidade de bytes (especificamente encoding size * data.length:)

lata
fonte
4

Desde a terceira versão do Swift, você pode fazer o seguinte:

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

semelhante ao que Sunkas aconselhou.

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

Outra resposta baseada em extensões (garoto, eu sinto falta disso em Java):

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

Então você pode usá-lo:

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

Observe que a string é opcional, a inicial NSDatapode ser inconversível ao Utf8.

elcuco
fonte
0

Objetivo - C

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
fonte