配列に入ってるデータを使って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になってる