配列に入ってるデータを使ってurlのパラメータをforで作ろうとしたら、mapが簡単と言われたので試してみた備忘録です

mapって何すんの?

mapっていうのは、配列などのコレクションの各要素に対して、同じ処理を適用して、その結果から新しいコレクションを作成する機能らしい。

これはSwiftの配列だけでなく、オプショナル型にも適用されるものらしい。

配列やコレクションに入ってるデータでURLを生成したい

パラメータ用のコレクションや配列を使って、URLのパラメータを作る時、for ではなく、mapを使うといいらしいので、試してみた。

let array = ["array1":"apple","array2":"grape","array3":"banana"]

let result = array.map{"\($0.key)=\($0.value)"}.joined(separator: "&")

///結果
/// array3=banana&array1=apple&array2=grape
//key valueそれぞれに同じ処理ができた。そして、.joinedで結合、文字列をつくった

コードがシンプルでとても可読性があがりました。

注意点があって、forと違い、順番はランダムなので、実行時によって、結果の文字列が変わるっぽい。
なので、URLのパラメータには向いてるけど、順番が大事なシーンに使うものではなさそうです。

ちなみに、joinedは、結合する時の文字列なので、&以外でも好きに結合文字列を決めれます

forとかで作らないのはなぜ?

■答え
こっちがわかりやすいし、ミスが減るし可読性が高くなるから


と、某AIが言ってました

Int?からString?へcastしたい

このmapのいいところは、オプショナルの処理もできるところで、nilの場合はnilを返し、nilじゃない時は通常の処理で返すことができる。

つまり、String(int) とした時、intがnilじゃなければString(int)で、
nilだったら、nilを返すので、返り値としてはoptionalになってる。

それを利用して、castをすると以下になる

/// numをInt8? から String? へcastする

let num:Int8? = 8

let str:String? = num.map{String(num)}

///numがnilの場合はnilを返し、numがnilじゃない場合はString(num)なので、optionalになってる

コメント