Creazione di NSData da NSString in Swift


174

Sto finalmente cercando di avere un NSMutableURLRequestcon un valido HTTPBody, ma non riesco a ottenere i miei dati di stringa (provenienti da a UITextField) in un NSDataoggetto utilizzabile .

Ho visto questo metodo per andare dall'altra parte:

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

Ma non riesco a trovare alcuna documentazione per il mio caso d'uso. Sono aperto a inserire la stringa in un altro tipo, se necessario, ma nessuna delle opzioni di inizializzazione per l' NSDatautilizzo di Swift sembra essere ciò che sto cercando.

Risposte:


359

In Swift 3

let data = string.data(using: .utf8)

In Swift 2 (o se hai già NSStringun'istanza)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

In Swift 1 (o se hai un rapido String):

let data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding)

Si noti inoltre che dataè un Optional<NSData>(poiché la conversione potrebbe non riuscire), quindi è necessario decomprimerlo prima di utilizzarlo, ad esempio:

if let d = data {
    println(d)
}

Swift può inferire il tipo di NSData?
Nicolas Manzini,

@NicolasManzini certo che può, come con qualsiasi altro tipo.
Gabriele Petronella,

2
@macdonjo sì, quell'API è cambiata nel tempo e ora restituisce un Optional<NSData>, che devi scartare prima di utilizzare
Gabriele Petronella,

3
In Swift2, non è necessario utilizzare il cast "come" poiché viene automaticamente gettato un ponte
Jacky,

1
Una conversione in UTF-8 non può fallire, quindi un'associazione opzionale non è davvero necessaria, puoi forzare-scartarla qui.
Martin R,

33

Swift 4 e 3

La creazione Datadell'oggetto Stringdall'oggetto è stata modificata in Swift 3. La versione corretta ora è:

let data = "any string".data(using: .utf8)

Grazie. Questo ha funzionato perfettamente per me in Swift 3. let input = "test string" let xdata = input.data (usando: String.Encoding.utf8)
raddevus

1
Hai idea del perché String (data: data !, codifica: .nonLossyASCII) sarà nulla?
Happiehappie,

4

Ecco un metodo molto semplice

let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

4

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)

Non utilizzare NSStringin Swift.
vadian del

3
// Checking the format
var urlString: NSString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)

// Convert your data and set your request's HTTPBody property
var stringData: NSString = NSString(string: "jsonRequest=\(urlString)")

var requestBodyData: NSData = stringData.dataUsingEncoding(NSUTF8StringEncoding)!

2

Per creare dati non opzionali ti consiglio di usarli:

let key = "1234567"
let keyData = Data(key.utf8)

1
In Swift 3+ questo è il modo più efficiente.
vadian del

2

Rapido 4.2

let data = yourString.data(using: .utf8, allowLossyConversion: true)


0

Converti stringa in dati

extension String {
    func toData() -> Data {
        return Data(self.utf8)
    }
}

Converti dati in stringa

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
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.