SwiftでBase64 Encode / Decodeする

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

```swift
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はこんな感じです。

```swift
// 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](https://developer.apple.com/reference/swift/optionset)
* [NSData\.Base64EncodingOptions \- NSData \| Apple Developer Documentation](https://developer.apple.com/reference/foundation/nsdata.base64encodingoptions)

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

```swift
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の累乗にあたらないから、`[]`になるという理解です。(違っていたら指摘お願いします)

```swift
    /// 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)`と指定するのは可読性が低いので、オプションは省略するのが良さそうです。

* https://github.com/apple/swift/commit/87b7bcfd3e5b90c6b425231e830e73bb02ebf910#diff-60fab3968490aded2585457736a8b091R458

----

## 追記

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

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

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