Quero converter uma string em Base64. Encontrei respostas em vários lugares, mas não funciona mais no Swift. Estou usando o Xcode 6.2. Acredito que a resposta pode ser trabalhar em versões anteriores do Xcode e não no Xcode 6.2.
Alguém poderia me orientar para fazer isso no Xcode 6.2?
A resposta que encontrei foi esta, mas não funciona na minha versão do Xcode:
var str = "iOS Developer Tips encoded in Base64"
println("Original: \(str)")
// UTF 8 str from original
// NSData! type returned (optional)
let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding)
// Base64 encode UTF 8 string
// fromRaw(0) is equivalent to objc 'base64EncodedStringWithOptions:0'
// Notice the unwrapping given the NSData! optional
// NSString! returned (optional)
let base64Encoded = utf8str.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
println("Encoded: \(base64Encoded)")
// Base64 Decode (go back the other way)
// Notice the unwrapping given the NSString! optional
// NSData returned
let data = NSData(base64EncodedString: base64Encoded, options: NSDataBase64DecodingOptions.fromRaw(0)!)
// Convert back to a string
let base64Decoded = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Decoded: \(base64Decoded)")
ref: http://iosdevelopertips.com/swift-code/base64-encode-decode-swift.html
Respostas:
Não tenho o 6.2 instalado, mas não acho que o 6.3 seja diferente a esse respeito:
dataUsingEncoding
retorna um opcional, então você precisa desembrulhar isso.NSDataBase64EncodingOptions.fromRaw
foi substituído porNSDataBase64EncodingOptions(rawValue:)
. Surpreendentemente, este não é um inicializador failable, então você não precisa desembrulhá-lo.Mas, como
NSData(base64EncodedString:)
é um inicializador failable, você precisa desembrulhá-lo.Aliás, todas essas mudanças foram sugeridas pelo migrador Xcode (clique na mensagem de erro na sarjeta e tem uma sugestão de “consertar”).
O código final, reescrito para evitar desempacotamento forçado, tem a seguinte aparência:
(se estiver usando o Swift 1.2, você pode usar vários if-lets em vez do mapa)
Atualização do Swift 5:
fonte
[]
vez deNSDataBase64EncodingOptions(rawValue: 0)
?[]
é o valor padrão, então você pode simplesmente chamar a função sem passar nenhum parâmetro:utf8str?.base64EncodedString()
Rápido
fonte
dfYcSGpvBqyzvkAXkdbHDA==
e a saída esperada tinha que ser:u�Hjo���@���
mas a função acima retorna nulo. Você pode verificar a saída da string de base 64 acima nestes sites: Site1 , Site2Você poderia simplesmente fazer uma extensão simples como:
iOS 7 e superior
fonte
Swift 4.0.3
fonte
Data(self.utf8).base64EncodedString()
opcional, seria necessário para toBase64 (). Da resposta abaixo: stackoverflow.com/a/35360697/129202Swift 4.2
fonte
Após uma pesquisa completa, encontrei a solução
Codificação
Decodificação
Mais sobre este http://creativecoefficient.net/swift/encoding-and-decoding-base64/
fonte
Xcode 8.3.2 • Swift 3.1
fonte
Swift 3 ou 4
fonte
Swift 5.1 , Xcode 11 :
fonte
Swift 3/4 / 5.1
Aqui está uma
String
extensão simples , permitindo a preservação de opcionais no caso de um erro na decodificação.Exemplo:
fonte
Depois de toda luta, eu fiz assim.
Depois de chamar outra função para converter string decodificada em dicionário
// para string para dicionário
fonte
PARA SWIFT 3.0
fonte
Swift 4.2
para decodificar, consulte (em https://gist.github.com/stinger/a8a0381a57b4ac530dd029458273f31a )
fonte
SwiftyBase64 (divulgação completa: eu escrevi) é uma codificação Swift Base64 nativa (sem biblioteca de decodificação. Com ela, você pode codificar Base64 padrão:
ou URL e nome de arquivo Safe Base64:
fonte
Resposta @Airspeed Velocity em Swift 2.0:
fonte