SwiftでArray(配列)などをシャッフル

スポンサーリンク

Swift 2 の環境で Array(配列)をランダムにシャッフルしたい機会があった。標準の API にはなかったようなので、検索してアルゴリズムを調べつつシャッフルメソッドを実装しました。

— 環境 —
Xcode 7.0
Swift 2.0
Mac OS X Yosemite 10.10.5

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

実装は以下のような感じ。

配列 Array や Range などをシャッフルするメソッド実装

shuffleBang() は破壊的に配列をシャッフルするメソッドです。破壊的というのは、引数で渡した元の配列自体をシャッフルしてしまうという意味で使ってます、Ruby 的な用語かもしれません。

shuffleArray() は破壊的でないシャッフルメソッドで、引数には Array(配列)のみを受け付ける。shuffule() は破壊的でないシャッフルメソッドで、引数には Array, Range などを受け付ける。

実装のアルゴリズムは以下のページなどを参考にしました。

swift2 – fatal error: swapping a location with itself is not supported with Swift 2.0 – Stack Overflow
swiftでシャッフル関数 – Qiita

の行を書いているのは、Swift 2 だと以下のように同じインデックス位置の swap ができない、とエラーが発生するため。

Ruby の Array#shuffle 実装を参考にしてみた

Ruby の Array#shuffule の実装が気になったのでソースコードを読んでみたところ…

Ruby の Array#shuffule 実装 – GitHub

Ruby での実装の書き方のほうが分かりやすかったので、後ほどそれを真似た書き方に変更しました。

for でも while でもやってることは同じようなことかと思います。

Playground でのテスト

以下 Xcode の Playground での実験。

目的通りに動作しているのを確認できた。

スポンサーリンク
 
スポンサーリンク

Leave Your Message!