Criando NSData a partir de NSString no Swift

174

Estou tentando finalmente ter um NSMutableURLRequestcom um válido HTTPBody, mas não consigo obter meus dados de string (provenientes de a UITextField) em um NSDataobjeto utilizável .

Eu já vi esse método para ir para o outro lado:

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

Mas não consigo encontrar nenhuma documentação para o meu caso de uso. Estou aberto a colocar a string em outro tipo, se necessário, mas nenhuma das opções de inicialização para NSDatausar o Swift parece ser o que estou procurando.

Jackson Egan
fonte

Respostas:

359

Em Swift 3

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

No Swift 2 (ou se você já tem uma NSStringinstância)

let data = string.dataUsingEncoding(NSUTF8StringEncoding)

No Swift 1 (ou se você tiver um swift String):

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

Observe também que dataé um Optional<NSData>(já que a conversão pode falhar), portanto, você precisará desembrulhá-lo antes de usá-lo, por exemplo:

if let d = data {
    println(d)
}
Gabriele Petronella
fonte
Swift pode inferir o tipo NSData?
Nicolas Manzini
@NicolasManzini com certeza, como em qualquer outro tipo.
Gabriele Petronella
2
@macdonjo sim, que API mudou ao longo do tempo e agora ele retorna um Optional<NSData>, o que você precisa para desembrulhar antes de usar
Gabriele Petronella
3
Em Swift2, não há necessidade de usar "como" cast desde que está em ponte automaticamente
Jacky
1
Uma conversão para UTF-8 não pode falhar; portanto, uma ligação opcional que realmente não é necessária, você pode forçar a desembrulhar aqui.
Martin R
33

Swift 4 e 3

A criação do Dataobjeto a partir do Stringobjeto foi alterada no Swift 3. A versão correta agora é:

let data = "any string".data(using: .utf8)
Disse Sikira
fonte
Obrigado. Isso funcionou para mim no swift 3 perfeitamente. deixe "string test" input = deixar xdata = input.data (usando: String.Encoding.utf8)
raddevus
1
Alguma idéia de por que String (data: data!, Codificação: .nonLossyASCII) será nula?
Happiehappie
4

Aqui método muito simples

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

Swift 4

let data = myStringVariable.data(using: String.Encoding.utf8.rawValue)
jatin
fonte
Não use NSStringno 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
fonte
2

Para criar dados não opcionais, recomendo usá-los:

let key = "1234567"
let keyData = Data(key.utf8)
Ramis
fonte
1
No Swift 3+, essa é a maneira mais eficiente.
Vadian
2

Swift 4.2

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

No rápido 5

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

Converter String em Dados

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

Converter dados em string

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