がっじゅぐいぎだがっだぁああああ
こんにちは 131e55 です❗
Swift愛好会 Advent Calendar 2016 13日目です❗
また、Swift その2 Advent Calendar 2016 13日目 - ポーカー作りで Swift 3 の空気を感じるも同日公開しているので覗いてみてください🐱(宣伝)
さて、Swift愛好会には多分過去2回お邪魔させていただきまして、いつも気軽にお話できる印象があり楽しい限りです。🍺のせいかもしれませんが(´•⌔•`)
今回は、Swift を書いているときに、配列を条件のもとに分割したくなったけどうまい方法がわからなく色々考えた。というお話をしたいと思います❗Swift愛好会の皆様からのアイデアを募集します❗(たすけて
メインテーマ「配列を条件のもとに分割したい」
例1. Int の配列を奇数と偶数の配列に分割したい
let numbers: [Int] = [1, 2, 3, 4, 5, 6]
// ↓
// [1, 3, 5]
// [2, 4, 6]
例2. UIColor の配列を有彩色と無彩色の配列に分割したい
let colors: [UIColor] = [.red, .green, .blue, white, .cyan, .magenta, .yellow, .black, .gray]
// ↓
// [.red, .green, .blue, .cyan, .magenta, .yellow]
// [.white, .black, .gray]
アプローチ1. filter
連打
第一感は filter
でした。filter
を使えば条件に合うものを抽出できますが、元の配列は変更されないので奇数の抽出と偶数の抽出を2回やるという方法です。無難そうですが filter
一回につき全要素を洗ってしまうのは冗長な感じ。なんで6回じゃなく7回なのかはわかりませんが。
アプローチ2. filter
+ 差集合
これは……読みづらすぎる感……。しかも一度集合にしてしまうので Hashable
な配列である必要がありますし、配列の順番が保証されないので、ここから sort
を走らせるならやっぱり filter
連打の方が良さそうです。
アプローチ3. reduce
で頑張る
filter
連打のループ数問題は解決されてますが、長いし何より読みづらい。これなら filter
連打で良いかな…。
アプローチ4. おとなしく for in
なんか古臭い気もしますがありそうっちゃありそうです。ただ for
で回すと reduce
もそうですが回して何をしたいのかを解読しないといけません。何より oddNumbers
、evenNumbers
を定数にしたいときどうしたらいいんでしょう。やっぱり filter
連打かな…❓
アプローチ5. 最終手段 Array
拡張
条件を渡して条件に合うものと合わないものに2分する separated
を Array
に追加してみました。
なんで7回になるのかはやっぱりわかりませんがすごく良さそうです。filter
連打のループ数問題も解決されていますし読みやすさも悪くないかと。
しかし extension
はオレオレになりがちなところが気になるので標準でで きるなら標準でしたほうが良い気も。個人的には変な改造せずに標準で使っていきたい派なのでやっぱり filter
連打を選択しそうかも…?
おしえてSwift愛好会のみんな❗
というわけでどうするのが良いと思いますか❓皆様のアイデア募集❗
「こんなことしなくても◯◯でええやん」的なのに期待してます(´•⌔•`)