Как я могу кодировать строку в Base64 в Swift?
Я хочу преобразовать строку в Base64. Я нашел ответы в нескольких местах, но он больше не работает в Swift. Я использую Xcode 6.2. Я считаю, что ответ может быть работать в предыдущих версиях Xcode, а не Xcode 6.2.
может кто-нибудь, пожалуйста, направлять меня, чтобы сделать это в Xcode 6.2?
ответ я нашел, но он не работает в моей версии 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
12 ответов:
у меня нет 6.2 установлен, но я не думаю, что 6.3 отличается в этом отношении:
dataUsingEncodingвозвращает необязательный, поэтому вам нужно развернуть его.
NSDataBase64EncodingOptions.fromRawбыл замененNSDataBase64EncodingOptions(rawValue:). Немного удивительно, но это не неисправный инициализатор, поэтому вам не нужно его разворачивать.но так как
NSData(base64EncodedString:)и отказоустойчивый инициализатор, вам нужно развернуть его.кстати, все эти изменения были предложены Xcode migrator (нажмите на сообщение об ошибке в желобе, и у него есть предложение" fix-it").
окончательный код, переписанный во избежание принудительного разворачивания, выглядит так:
import Foundation let str = "iOS Developer Tips encoded in Base64" println("Original: \(str)") let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding) if let base64Encoded = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) { println("Encoded: \(base64Encoded)") if let base64Decoded = NSData(base64EncodedString: base64Encoded, options: NSDataBase64DecodingOptions(rawValue: 0)) .map({ NSString(data: , encoding: NSUTF8StringEncoding) }) { // Convert back to a string println("Decoded: \(base64Decoded)") } }(при использовании Swift 1.2 вы можете использовать несколько if-lets вместо карты)
Swift 3
import UIKit extension String { func fromBase64() -> String? { guard let data = Data(base64Encoded: self) else { return nil } return String(data: data, encoding: .utf8) } func toBase64() -> String { return Data(self.utf8).base64EncodedString() } }Swift 2.3
import UIKit extension String { func fromBase64() -> String? { guard let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) else { return nil } return String(data: data, encoding: NSUTF8StringEncoding) } func toBase64() -> String? { guard let data = self.dataUsingEncoding(NSUTF8StringEncoding) else { return nil } return data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) } }
вы могли бы просто сделать простое расширение, как:
import UIKit // MARK: - Mixed string utils and helpers extension String { /** Encode a String to Base64 :returns: */ func toBase64()->String{ let data = self.dataUsingEncoding(NSUTF8StringEncoding) return data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) } }iOS 7 и выше
Swift 4.0.3
import UIKit extension String { func fromBase64() -> String? { guard let data = Data(base64Encoded: self, options: Data.Base64DecodingOptions(rawValue: 0)) else { return nil } return String(data: data as Data, encoding: String.Encoding.utf8) } func toBase64() -> String? { guard let data = self.data(using: String.Encoding.utf8) else { return nil } return data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) } }
после тщательного исследования я нашел решение
кодирование
let plainData = (plainString as NSString).dataUsingEncoding(NSUTF8StringEncoding) let base64String =plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!) println(base64String) // bXkgcGxhbmkgdGV4dA==декодирования
let decodedData = NSData(base64EncodedString: base64String, options:NSDataBase64DecodingOptions.fromRaw(0)!) let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) println(decodedString) // my plain dataподробнее об этом http://creativecoefficient.net/swift/encoding-and-decoding-base64/
Xcode 8.3.2 * Swift 3.1
extension String { var data: Data { return Data(utf8) } var base64Encoded: Data { return data.base64EncodedData() } var base64Decoded: Data? { return Data(base64Encoded: self) } } extension Data { var string: String? { return String(data: self, encoding: .utf8) } }
let original = "iOS Developer Tips encoded in Base64" let utf8Data = original.data // 36 bytes let base64EncodedString = utf8Data.base64EncodedString() // aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0\n" let base64EncodedData = utf8Data.base64EncodedData() // 48 bytes" print("base64EncodedData:", original.base64Encoded) // 48 bytes print("base64EncodedString:", original.base64Encoded.string ?? "") // "aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0" print("base64DecodedData:", original.base64Encoded.string?.base64Decoded ?? "") // 36 bytes print("base64DecodedString:", original.base64Encoded.string?.base64Decoded?.string ?? "") // iOS Developer Tips encoded in Base64
Swift 3
вот простой
Stringрасширение обновлено для Swift 3, что позволяет сохранять опциональность в случае ошибки при декодировании.extension String { /// Encode a String to Base64 func toBase64() -> String { return Data(self.utf8).base64EncodedString() } /// Decode a String from Base64. Returns nil if unsuccessful. func fromBase64() -> String? { guard let data = Data(base64Encoded: self) else { return nil } return String(data: data, encoding: .utf8) } }пример:
let testString = "A test string." let encoded = testString.toBase64() // "QSB0ZXN0IHN0cmluZy4=" guard let decoded = encoded.fromBase64() // "A test string." else { return }
после всей борьбы мне это понравилось.
func conversion(str:NSString) { if let decodedData = NSData(base64EncodedString: str as String, options:NSDataBase64DecodingOptions(rawValue: 0)), let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) { print(decodedString)//Here we are getting decoded stringпосле того, как я вызываю другую функцию для преобразования декодированной строки в словарь
self .convertStringToDictionary(decodedString as String) } }//function close//для строки в словарь
func convertStringToDictionary(text: String) -> [String:AnyObject]? { if let data = text.dataUsingEncoding(NSUTF8StringEncoding) { do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject] print(json) if let stack = json!["cid"] //getting key value here { customerID = stack as! String print(customerID) } } catch let error as NSError { print(error) } } return nil }
ДЛЯ SWIFT 3.0
let str = "iOS Developer Tips encoded in Base64" print("Original: \(str)") let utf8str = str.data(using: String.Encoding.utf8) if let base64Encoded = utf8str?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) { print("Encoded: \(base64Encoded)") if let base64Decoded = NSData(base64Encoded: base64Encoded, options: NSData.Base64DecodingOptions(rawValue: 0)) .map({ NSString(data: as Data, encoding: String.Encoding.utf8.rawValue) }) { // Convert back to a string print("Decoded: \(base64Decoded)!") } }
SwiftyBase64 (полное раскрытие: я написал это) - это родная кодировка Swift Base64 (без библиотеки декодирования. С его помощью вы можете кодировать стандартный Base64:
let bytesToEncode : [UInt8] = [1,2,3] let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode)или URL и имя файла Safe Base64:
let bytesToEncode : [UInt8] = [1,2,3] let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode, alphabet:.URLAndFilenameSafe)
@Airspeed Velocity ответ в Swift 2.0:
let str = "iOS Developer Tips encoded in Base64" print("Original: \(str)") let base64Encoded = str.dataUsingEncoding(NSUTF8StringEncoding)!.base64EncodedStringWithOptions([]) print("Encoded: \(base64Encoded)") let base64DecodedData = NSData(base64EncodedString: base64Encoded, options: [])! var base64DecodedString = String(data: base64DecodedData, encoding: NSUTF8StringEncoding)! print("Decoded: \(base64DecodedString)")
Comments