1. ホーム
  2. swift

[解決済み] Swiftで文字列をBase64にエンコードするにはどうすればいいですか?

2022-05-07 18:51:15

質問

文字列をBase64に変換したいのですが、どうすればいいですか?いくつかの場所で答えを見つけたのですが、Swiftではもう動きません。私はXcode 6.2を使っています。私は答えがXcode 6.2ではなく、以前のXcodeバージョンで動作する可能性があると信じています。

どなたか、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.fromRawNSDataBase64EncodingOptions(rawValue:) . 少し意外なことに、これは失敗するイニシャライザーではないので、アンラップする必要はありません。

しかし NSData(base64EncodedString:) は失敗するイニシャライザーなので、それをアンラップする必要があります。

これらの変更はすべて Xcode migrator によって提案されたものです (ガターでエラーメッセージをクリックすると、"fix-it" の提案があります)。

force-unwrapを避けるために書き直した最終的なコードは以下のようになります。

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 を使用することができます)

Swift 5のアップデート。

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