Erstellen von NSData aus NSString in Swift

174

Ich versuche letztendlich eine NSMutableURLRequestmit einer gültigen zu haben HTTPBody, aber ich kann meine Zeichenfolgendaten (die von a stammen UITextField) nicht in ein verwendbares NSDataObjekt übertragen.

Ich habe diese Methode gesehen, um in die andere Richtung zu gehen:

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

Aber ich kann anscheinend keine Dokumentation für meinen Anwendungsfall finden. Ich bin offen dafür, die Zeichenfolge bei Bedarf in einen anderen Typ umzuwandeln, aber keine der Initialisierungsoptionen für die NSDataVerwendung von Swift scheint das zu sein, wonach ich suche.

Jackson Egan
quelle

Antworten:

359

In Swift 3

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

In Swift 2 (oder wenn Sie bereits eine NSStringInstanz haben)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

In Swift 1 (oder wenn Sie einen Swift haben String):

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

Beachten Sie auch, dass dies dataeine ist Optional<NSData>(da die Konvertierung möglicherweise fehlschlägt), sodass Sie sie vor der Verwendung auspacken müssen, zum Beispiel:

if let d = data {
    println(d)
}
Gabriele Petronella
quelle
Swift kann auf NSData-Typ schließen?
Nicolas Manzini
@NicolasManzini sicher, es kann, wie bei jedem anderen Typ.
Gabriele Petronella
2
@macdonjo yep, diese API hat sich im Laufe der Zeit geändert und gibt jetzt eine zurück Optional<NSData>, die Sie vor der Verwendung auspacken müssen
Gabriele Petronella
3
In Swift2 muss "as" nicht verwendet werden, da es automatisch überbrückt wird
Jacky
1
Eine Konvertierung zu UTF-8 kann nicht fehlschlagen. Daher ist eine optionale Bindung nicht unbedingt erforderlich. Sie können das Erzwingen hier ausschließen.
Martin R
33

Swift 4 & 3

Das Erstellen eines DataObjekts aus einem StringObjekt wurde in Swift 3 geändert. Die korrekte Version lautet jetzt:

let data = "any string".data(using: .utf8)
Sagte Sikira
quelle
Vielen Dank. Das hat bei mir in Swift 3 perfekt funktioniert. let input = "test string" let xdata = input.data (mit: String.Encoding.utf8)
raddevus
1
Irgendeine Idee, warum String (data: data!, Kodierung: .nonLossyASCII) gleich Null ist?
Happiehappie
4

Hier sehr einfache Methode

let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
Shafraz Buhary
quelle
4

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
Jatin
quelle
Nicht NSStringin Swift verwenden.
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
quelle
2

Um nicht optionale Daten zu erstellen, empfehle ich die Verwendung:

let key = "1234567"
let keyData = Data(key.utf8)
Ramis
quelle
1
In Swift 3+ ist dies der effizienteste Weg.
Vadian
2

Swift 4.2

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

In schneller 5

let data = Data(YourString.utf8)
Sanjay Mishra
quelle
0

String in Daten konvertieren

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

Daten in Zeichenfolge konvertieren

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
Sumit
quelle