Optional型のArrayのmapメソッドを使う際、mapの扱いを見落として使ってしまいがちだったので、戒めのためにメモ
@koherさんの記事「ArrayとOptionalのmapは同じです」で
Optional や Array を値を入れる箱だと考えると、 map は箱から値を取り出さずに操作するためのメソッド/関数です
という概念で理解できました。
配列の中身を一つづつ、処理しようと、以下のように書くと
let numbers: [Int]?
numbers = [1, 2, 3, 4]
numbers.map {
print($0)
}
結果は
print($0) // [1, 2, 3, 4]
になります。
これは
Optional型に、mapメソッドを通した場合
Unwrapの処理が行われ、Optional型 → 非Optional型になるからです。
期待する動作(配列の中身を一つづつ処理する)をしたい場合は、以下です
let texts: [String]?
numbers.map {
print($0) // [1, 2, 3, 4]
let update_numbers = $0.map {
$0 + 2
}
print(update_numbers) // [3, 4, 5, 6]
}
これは、
if let numbers = numbers {
print(numbers) // [1, 2, 3, 4]
let update_numbers = numbers.map {
$0 + 2
}
print(update_numbers) // [3, 4, 5, 6]
}
と同じ動作をします
違いは
前者のmap
でのUnwrapは、箱から値を取り出さずに操作し
後者のif let
でのUnwrapは、一旦、変数に代入して、if文の中で操作
という違いで、特に大きな違いはないので、好みでいいのかと思いますが
自分は前者の方がスッキリして、見やすいかなと思います。
ただ、後者は何をやってるのかは、パッと見で分かりやすいので
レビュー者との共通認識で、どちらかを使うか決めた方が良さそうです。