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.

Jackson Egan
la source

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)
}
Gabriele Petronella
la source
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)
Dit Sikira
la source
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)
Shafraz Buhary
la source
4

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
jatin
la source
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)!
Vinod Joshi
la source
2

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

let key = "1234567"
let keyData = Data(key.utf8)
Ramis
la source
1
Dans Swift 3+, c'est le moyen le plus efficace.
vadian
2

Swift 4.2

let data = yourString.data(using: .utf8, allowLossyConversion: true)
moiMadhav
la source
2

Dans Swift 5

let data = Data(YourString.utf8)
Sanjay Mishra
la source
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)
      }
   }
Sumit
la source