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)

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.


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)

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


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.


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

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.