Come inizializzare una stringa da NSData in Swift


173

Ho cercato di inizializzare una stringa da NSDatain Swift.

Nella documentazione NSString Cocoa, Apple afferma che è necessario utilizzare questo:

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

Tuttavia, Apple non ha incluso alcun esempio per l'utilizzo o dove collocare il file init.

Sto cercando di convertire il seguente codice da Objective-C a Swift

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

Ho provato molte possibili sintassi come la seguente (ovviamente non ha funzionato):

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

Risposte:


224

Ecco come dovresti inizializzare NSString:

Swift 2.X o precedente

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

Swift 3 o più recente:

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

Questo documento spiega la sintassi.


2
Si noti che non è necessario ripetere "dati" e "codifica" in questo modo.
jbg

19
Dovrebbe esserelet datastring = NSString(data: fooData, encoding:NSUTF8StringEncoding)
Yas T.

14
È possibile convertire NSDatadirettamente in Swift String(anziché in NSString)?
ma11hew28,

3
@MattDiPasquale var swiftString = NSString (data: NSData !, codifica: UInt) as! String è tutto
Gintama,

11
@MattDiPasquale Ignora il cast forzato sopra; Stringè un NSString... tutti questi dovrebbero essere:var datastring = String(data: someData, encoding: NSUTF8StringEncoding)
JRaymond,

278

Questo è il codice implementato necessario:

in Swift 3.0:

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

o solo

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

Vecchia versione rapida:

in Swift 2.0:

import Foundation

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

in Swift 1.0:

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

Swift 2 ha un modo diverso di farlo
Departamento B,

3
Aggiunta anche una versione Swift 2.0 ora
Sunkas

Ti capita di conoscere il modo Swift 3.0? error: use of unresolved identifier 'NSUTF8StringEncoding'
Glenn 'devalias',

2
Aggiunta anche una versione Swift 3.0. Accidenti, ad Apple piace cambiare roba!
Sunkas,

1
Devi compilare contro una versione specifica di Swift, quindi il tuo codice verrà scritto su 2.xo 3.x. Inoltre, nota con la versione 3.0 che puoi accorciare usando var dataString = String(data: fooData, encoding: .utf8).
Ruttopia,

15

Swift 2.0

Sembra che Swift 2.0 abbia effettivamente introdotto l' String(data:encoding:)estensione String durante l'importazione Foundation. Non ho trovato nessun posto in cui questo sia documentato, stranamente.

(pre Swift 2.0) Estensione leggera

Ecco una piccola estensione incollabile in copia senza usare NSString, tagliamo l'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)
}

Questo ti dà anche accesso a data.byteBufferquale è un tipo di sequenza, quindi tutte quelle fantastiche operazioni che puoi fare con le sequenze funzionano anche, come fare un reduce { $0 &+ $1 }per un checksum.

Appunti

Nella mia modifica precedente, ho usato questo metodo:

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

Il problema con questo approccio è che sto creando una copia delle informazioni in una nuova matrice, quindi, sto duplicare la quantità di byte (specificamente: encoding size * data.length)


4

Dalla terza versione di Swift è possibile effettuare le seguenti operazioni:

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

simile a ciò che ha consigliato Sunkas.


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

2

Un'altra risposta basata sulle estensioni (ragazzo, mi manca questo in Java):

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

Quindi puoi usarlo:

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

Si noti che la stringa è facoltativa, l'iniziale NSDatapotrebbe non essere convertibile in Utf8.


0

Obiettivo - C

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

veloce

//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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.