LoginSignup
29
27

More than 5 years have passed since last update.

SwiftでBase64 Encode / Decodeする

Last updated at Posted at 2017-02-01

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 '[]'.と記載されているので、確かに []とした方が良さそうです。

29
27
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
27