183

I'm trying to ultimately have an NSMutableURLRequest with a valid HTTPBody, but I can't seem to get my string data (coming from a UITextField) into a usable NSData object.

I've seen this method for going the other way:

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

But I can't seem to find any documentation for my use case. I'm open to putting the string into some other type if necessary, but none of the initialization options for NSData using Swift seem to be what I'm looking for.

0

9 Answers 9

373

In Swift 3

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

In Swift 2 (or if you already have a NSString instance)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

In Swift 1 (or if you have a swift String):

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

Also note that data is an Optional<NSData> (since the conversion might fail), so you'll need to unwrap it before using it, for instance:

if let d = data {
    println(d)
}
Sign up to request clarification or add additional context in comments.

8 Comments

Swift can infer NSData type?
@NicolasManzini sure it can, as with any other type.
@macdonjo yep, that API changed over time and now it returns an Optional<NSData>, which you need to unwrap before using
In Swift2, there's no need to use "as" cast since it's automatically bridged
A conversion to UTF-8 cannot fail, therefore an optional binding it not really needed, you can force-unwrap here.
|
34

Swift 4 & 3

Creating Data object from String object has been changed in Swift 3. Correct version now is:

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

2 Comments

Thanks. This worked for me in swift 3 perfectly. let input = "test string" let xdata = input.data(using: String.Encoding.utf8)
Any idea why String(data: data!, encoding: .nonLossyASCII) will be nil?
6

In swift 5

let data = Data(YourString.utf8)

Comments

5

Convert String to Data

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

Convert Data to String

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

Comments

4

Here very simple method

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

Comments

4

Swift 4

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

1 Comment

Don't use NSString in Swift.
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)!

Comments

3

To create not optional data I recommend using it:

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

1 Comment

In Swift 3+ this is the most efficient way.
3

Swift 4.2

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.