Создание NSData из NSString в Swift

174

Я пытаюсь в конечном итоге получить NSMutableURLRequestс действительным HTTPBody, но я не могу получить свои строковые данные (поступающие из UITextField) в пригодный для использования NSDataобъект.

Я видел этот метод, чтобы пойти другим путем:

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

Но я не могу найти документацию для моего варианта использования. Я открыт для помещения строки в какой-то другой тип, если это необходимо, но ни один из вариантов инициализации для NSDataиспользования Swift, кажется, не является тем, что я ищу.

Джексон Иган
источник

Ответы:

359

В Свифт 3

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

В Swift 2 (или если у вас уже есть NSStringэкземпляр)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

В Swift 1 (или если у вас есть Swift String):

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

Также обратите внимание, что dataэто Optional<NSData>(поскольку преобразование может завершиться неудачей), поэтому вам нужно будет развернуть его перед использованием, например:

if let d = data {
    println(d)
}
Габриэле Петронелла
источник
Свифт может вывести тип NSData?
Николас Манзини
@NicolasManzini уверен, что может, как и любой другой тип.
Габриэле Петронелла
2
@macdonjo Да, этот API менялся с течением времени, и теперь он возвращает значение Optional<NSData>, которое нужно развернуть перед использованием
Gabriele Petronella
3
В Swift2 нет необходимости использовать «как» приведение, так как оно автоматически соединено
Джеки
1
Преобразование в UTF-8 не может завершиться неудачей, поэтому необязательное связывание не нужно, его можно принудительно развернуть здесь.
Мартин Р
33

Свифт 4 и 3

Создание Dataобъекта из Stringобъекта было изменено в Swift 3. Теперь верная версия:

let data = "any string".data(using: .utf8)
Саид Сикира
источник
Спасибо. Это сработало для меня в Swift 3 отлично. let input = "test string" let xdata = input.data (используя: String.Encoding.utf8)
raddevus
1
Любая идея, почему String (data: data !, кодировка: .nonLossyASCII) будет ноль?
Happiehappie
4

Здесь очень простой способ

let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
Шафраз Бухары
источник
4

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
Jatin
источник
Не используйте NSStringв 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)!
Винод Джоши
источник
2

Для создания необязательных данных я рекомендую использовать их:

let key = "1234567"
let keyData = Data(key.utf8)
Рамис
источник
1
В Swift 3+ это самый эффективный способ.
Вадиан
2

Swift 4.2

let data = yourString.data(using: .utf8, allowLossyConversion: true)
meMadhav
источник
2

Свифт 5

let data = Data(YourString.utf8)
Санджай Мишра
источник
0

Преобразовать строку в данные

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

Конвертировать данные в строку

extension Data {
      func toString() -> String {
          return String(decoding: self, as: UTF8.self)
      }
   }
Sumit
источник