我想把字符串转换成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)")

参考:http://iosdevelopertips.com/swift-code/base64-encode-decode-swift.html

推荐答案

我没有安装6.2,但我认为6.3在这方面没有任何不同:

dataUsingEncoding返回一个可选的,所以你需要打开它.

NSDataBase64EncodingOptions.fromRaw已被NSDataBase64EncodingOptions(rawValue:)所取代.稍微令人惊讶的是,这不是一个失败的初始值设定项,所以你不需要打开它.

但由于NSData(base64EncodedString:) is是一个失败的初始值设定项,你需要打开它.

顺便说一句,所有这些更改都是由Xcode migrator提出的(单击排水沟中的错误消息,它有一个"修复"建议).

为避免强制展开而重写的最终代码如下所示:

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: $0, encoding: NSUTF8StringEncoding) })
    {
        // Convert back to a string
        println("Decoded:  \(base64Decoded)")
    }
}

(如果使用Swift 1.2,可以使用多个if let,而不是 map )

Swift 5 Update:

import Foundation

let str = "iOS Developer Tips encoded in Base64"
print("Original: \(str)")

let utf8str = str.data(using: .utf8)

if let base64Encoded = utf8str?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) {
    print("Encoded: \(base64Encoded)")

    if let base64Decoded = Data(base64Encoded: base64Encoded, options: Data.Base64DecodingOptions(rawValue: 0))
    .map({ String(data: $0, encoding: .utf8) }) {
        // Convert back to a string
        print("Decoded: \(base64Decoded ?? "")")
    }
}

Swift相关问答推荐

Swift中可以取消的延迟任务

避免嵌套导航TabView

如何在AudioKit中实现自定义音效 node ?

如何在SwiftUI的文本视图中显示NSMutableAttributedString?

对实例方法appendInterpolation的调用没有完全匹配

try 从闭包访问返回的字符串时出现无法将类型 '()' 的返回表达式转换为返回类型 'String'编译器错误

使用`JSONSerialiser`时,省略通用可选项

减小SF符号的边框宽度

如何在 SwiftUI 中为过渡动画保持相同的标识

如何在 swiftui 中设置给定字符串类型日期的日期倒计时?

从 iPhone 中的安全飞地获取真正的随机数?

Swift 并发:@MainActor 对象上的通知回调

自定义 DispatchQueue 服务质量

异步等待不会在项目中触发,但在 Xcode playground 中工作正常

组合 flatMap 不会返回预期的上下文结果类型

临时添加到视图层次 struct 后,Weak view引用不会被释放

理解 Swift 2.2 Select 器语法 - #selector()

Swift中switch 盒的详尽条件

UITableViewCell 不显示 detailTextLabel.text - Swift

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?