Swift3でStringをMD5文字列に変換する時に得たことのメモ

StringをMD5に変換するのはこのようなコードになりました。

Swift3でStringをMD5に変換する

これを書いている中で学んだことのメモです。

文字の連結

NSDataではなくDataを使い、NSが付くものをあまり使わないようにと思っていたのです。

でも、MD5文字列に連結する箇所で、はじめはNSMutableStringを使っていました。

before

for i in 0 ..< digestLength {
    result.appendFormat("%02x", md5Buffer[i])
}
  • for文で書いていました
  • NSMutableStringを使っていました

何だかしっくりこない…と調べるうちにreduceが使えることを知りました。

after

md5String = (0..<digestLength).reduce("") { $0 + String(format:"%02x", md5Buffer[$1]) }
  • reduceを使いました
  • NSMutableStringがなくなりました

スッキリしました。

CountableRange

(0..<digestLength)

この部分はCountableRangeになっているのですね。

CountableRangeでは、mapfilterなどを使うことができます。

クロージャの書き方

きちんと理解できていなかったのでおさらい。
変化の軌跡を残してみます。

その1

md5String = (0..<digestLength).reduce("", { (result, index) -> String in
    return result + String(format: "%02x", md5Buffer[index])
})
  • 引数や戻り値の型をすべて記述しました。

その2

md5String = (0..<digestLength).reduce("") { result, index in result + String(format:"%02x", md5Buffer[index]) }
  • 型とreturnを省略しました。

その3

md5String = (0..<digestLength).reduce("") { $0 + String(format:"%02x", md5Buffer[$1]) }
  • 引数の名前を省略しました。

mapなどを使う時はこの省略形を最もよく目にするので、これを使うのが良いですね。

参考

MD5変換

CountableRange

クロージャ