Tworzenie NSData z NSString w Swift

174

Próbuję ostatecznie mieć NSMutableURLRequestpoprawną wartość HTTPBody, ale nie mogę uzyskać moich danych ciągu (pochodzących z a UITextField) do użytecznego NSDataobiektu.

Widziałem tę metodę pójścia w drugą stronę:

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

Ale nie mogę znaleźć żadnej dokumentacji dla mojego przypadku użycia. Jestem otwarty na umieszczenie ciągu w innym typie, jeśli to konieczne, ale żadna z opcji inicjalizacji NSDatakorzystania ze Swift nie wydaje się być tym, czego szukam.

Jackson Egan
źródło

Odpowiedzi:

359

W Swift 3

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

W Swift 2 (lub jeśli masz już NSStringinstancję)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

W Swift 1 (lub jeśli masz jerzyka String):

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

Pamiętaj również, że datajest to plik Optional<NSData>(ponieważ konwersja może się nie powieść), więc przed użyciem musisz go rozpakować, na przykład:

if let d = data {
    println(d)
}
Gabriele Petronella
źródło
Swift może wywnioskować typ NSData?
Nicolas Manzini
@NicolasManzini na pewno tak, jak w przypadku każdego innego typu.
Gabriele Petronella
2
@macdonjo tak, ten interfejs API zmienił się z czasem i teraz zwraca plik Optional<NSData>, który należy rozpakować przed użyciem
Gabriele Petronella
3
W Swift2 nie ma potrzeby używania obsady „jako”, ponieważ jest ona automatycznie łączona
Jacky
1
Konwersja do UTF-8 nie może się nie powieść, dlatego opcjonalne wiązanie nie jest potrzebne, możesz tutaj wymusić rozpakowanie.
Martin R,
33

Swift 4 i 3

Tworzenie Dataobiektu z Stringobiektu zostało zmienione w Swift 3. Poprawna wersja to:

let data = "any string".data(using: .utf8)
Said Sikira
źródło
Dzięki. To zadziałało dla mnie w Swift 3 idealnie. let input = "test string" let xdata = input.data (using: String.Encoding.utf8)
raddevus
1
Masz jakiś pomysł, dlaczego String (dane: dane !, kodowanie: .nonLossyASCII) będzie zerowe?
Happiehappie
4

Tutaj bardzo prosta metoda

let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
Shafraz Buhary
źródło
4

Szybki 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
jatin
źródło
Nie używaj NSStringw 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
źródło
2

Aby utworzyć dane nieobowiązkowe, polecam ich użycie:

let key = "1234567"
let keyData = Data(key.utf8)
Ramis
źródło
1
W Swift 3+ jest to najbardziej efektywny sposób.
vadian
2

Swift 4.2

let data = yourString.data(using: .utf8, allowLossyConversion: true)
meMadhav
źródło
2

Szybko 5

let data = Data(YourString.utf8)
Sanjay Mishra
źródło
0

Konwertuj ciąg na dane

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

Konwertuj dane na ciąg

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
Sumit
źródło