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.

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)
}

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)

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)

4

Swift 4

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

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)!

2

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

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

1
No Swift 3+, essa é a maneira mais eficiente.
Vadian

2

Swift 4.2

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


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)
      }
   }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.