post Image
SwiftでBase64 Encode / Decodeする

SwiftでBase64 Encodeするには以下のように書きます。
オプションの指定方法については記載しますが、オプションの内容については今回触れません。

let str = "hoge"
let data: Data = str.data(using: .utf8)!

// rawValueでオプション無しを設定(現在はあまり推奨できない書き方)
data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) // aG9nZQ==

// オプション無しだと明示したい場合(rawValueよりこっちを推奨)
data.base64EncodedString(options: []) // aG9nZQ==

// オプション無し
data.base64EncodedString() // aG9nZQ==

// オプション有り
data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) // aG9nZQ==

// オプション複数
data.base64EncodedString(options: [Data.Base64EncodingOptions.lineLength64Characters, Data.Base64EncodingOptions.endLineWithLineFeed]) // aG9nZQ==

Decodeはこんな感じです。

// rawValueでオプション無しを設定(現在はあまり推奨できない書き方)
let data = Data(base64Encoded: base64EncodedString, options: Data.Base64DecodingOptions(rawValue: 0))
let base64DecodedString = String(data: data!, encoding: .utf8)! // hoge

// // オプション無しだと明示したい場合(rawValueよりこっちを推奨)
String(data: Data(base64Encoded: base64EncodedString, options: [])!, encoding: .utf8) // hoge

// オプション無し
String(data: Data(base64Encoded: base64EncodedString)!, encoding: .utf8)! // hoge

// オプション有り
String(data: Data(base64Encoded: base64EncodedString, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)!, encoding: .utf8) // hoge

オプションとか指定しているrawValueってなんだろう?って思い調べると、NSData.Base64EncodingOptions(※) はOptionSetプロトコルを適用しています。OptionSetは、ビットマスクなんかを扱いやすくするプロトコルのようです。
※ DataのBase64EncodingOptionsはtypealiasでNSData.Base64EncodingOptionsを向いています

ドキュメントを読むと、個々のプロパティに対し、2の累乗の値のrawValueが割当たる模様です。
実際どうなっているのか確認してみました。(確かに2の累乗ですね)

print(Data.Base64EncodingOptions.lineLength64Characters) // Base64EncodingOptions(rawValue: 1)
print(Data.Base64EncodingOptions.lineLength76Characters) // Base64EncodingOptions(rawValue: 2)
print(Data.Base64EncodingOptions.endLineWithCarriageReturn) // Base64EncodingOptions(rawValue: 16)
print(Data.Base64EncodingOptions.endLineWithLineFeed) // Base64EncodingOptions(rawValue: 32)

オプション無しの場合はどうなるんだろう?って思っていたら、以下の定義になっていました。
[]だから、オプション無しってことでしょう。
rawValue: 0もおまじないのように書かれていますが、2の累乗にあたらないから、[]になるという理解です。(違っていたら指摘お願いします)

    /// Returns a Base-64 encoded string.
    ///
    /// - parameter options: The options to use for the encoding. Default value is `[]`.
    /// - returns: The Base-64 encoded string.
    public func base64EncodedString(options: Data.Base64EncodingOptions = default) -> String

ググっても、あまりオプション無しで書いている例がでなかったのですが、割と最近追加されたからですかね?
特にオプションを指定する必要がない場合、Data.Base64EncodingOptions(rawValue: 0)と指定するのは可読性が低いので、オプションは省略するのが良さそうです。


追記

オプションは要らないんだけど、明示的にオプションを指定していないよ、と伝えたい場合は

Data.Base64DecodingOptions(rawValue: 0) ではなく、data.base64EncodedString(options: [])としてあげるのが良いとコメントをいただきました。

定義を見てもDefault value is '[]'.と記載されているので、確かに []とした方が良さそうです。


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。