Création de NSData à partir de NSString dans Swift


174

J'essaie finalement d'avoir un NSMutableURLRequestavec un valide HTTPBody, mais je n'arrive pas à obtenir mes données de chaîne (provenant de a UITextField) dans un NSDataobjet utilisable .

J'ai vu cette méthode pour aller dans l'autre sens:

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

Mais je n'arrive pas à trouver de documentation pour mon cas d'utilisation. Je suis prêt à mettre la chaîne dans un autre type si nécessaire, mais aucune des options d'initialisation pour NSDatautiliser Swift ne semble être ce que je recherche.

Réponses:


359

Dans Swift 3

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

Dans Swift 2 (ou si vous avez déjà une NSStringinstance)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

Dans Swift 1 (ou si vous avez un swift String):

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

Notez également qu'il datas'agit d'un Optional<NSData>(car la conversion peut échouer), vous devrez donc le déballer avant de l'utiliser, par exemple:

if let d = data {
    println(d)
}

Swift peut-il déduire le type NSData?
Nicolas Manzini le

@NicolasManzini est sûr que c'est possible, comme avec tout autre type.
Gabriele Petronella

2
@macdonjo yep, cette API a changé avec le temps et maintenant elle renvoie un Optional<NSData>, que vous devez déballer avant de l'utiliser
Gabriele Petronella

3
Dans Swift2, il n'est pas nécessaire d'utiliser "comme" casting car il est automatiquement ponté
Jacky

1
Une conversion en UTF-8 ne peut pas échouer, donc une liaison facultative n'est pas vraiment nécessaire, vous pouvez forcer le déballage ici.
Martin R

33

Swift 4 et 3

La création d'un Dataobjet à partir d'un Stringobjet a été modifiée dans Swift 3. La version correcte est désormais:

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

Merci. Cela a parfaitement fonctionné pour moi dans Swift 3. let input = "test string" let xdata = input.data (en utilisant: String.Encoding.utf8)
raddevus

1
Une idée de la raison pour laquelle String (data: data !, encoding: .nonLossyASCII) sera nul?
Happiehappie

4

Voici une méthode très simple

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

4

Swift 4

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

Ne pas utiliser NSStringdans Swift.
vadian

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

Pour créer des données non facultatives, je recommande de l'utiliser:

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

1
Dans Swift 3+, c'est le moyen le plus efficace.
vadian

2

Swift 4.2

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


0

Convertir une chaîne en données

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

Convertir les données en chaîne

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.