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を向いています
- OptionSet - Swift Standard Library | Apple Developer Documentation
- NSData.Base64EncodingOptions - NSData | Apple Developer Documentation
ドキュメントを読むと、個々のプロパティに対し、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 '[]'.
と記載されているので、確かに []
とした方が良さそうです。