LoginSignup
34
29

More than 5 years have passed since last update.

【Swift】for文を逆順で回したいあなたに

Last updated at Posted at 2016-04-05

はじめに

独学でプログラミング学び始めて約1年、業務でプログラムを書き始めて2ヶ月、Swift始めて1ヶ月のSwifterです。
タイトルの通りですが、for文を逆から回したい時がたまーにあると思います。でも高速列挙では逆から回せないし、

for(var i = 10; i > 0; i--)

この書き方だと「将来廃止予定ですよ」なんて警告が出て嫌だし・・・という迷えるあなたに贈るメモです

対象となる人

・プログラミング/Swift初心者
・for文を警告なく逆から回したい

環境

xcode 7.2.1
Swift 2.1.1

やること

・for文を逆から回す

for文色々

逆から回す前にfor文の基本をおさらいします。

基本形

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
for var i = 0; i < 10; i++ {
    print(array[i])
}

これは将来廃止の可能性があるようなので、通常、高速列挙型を使います

高速列挙1

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
for i in 0..<array.count {
    print(array[i])
}

基本形と同じ意味ですが、for文の中身が短くなりました。

高速列挙2

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
for name in array {
   print(name)
}

こんな書き方もできますね。出力内容は全て同じです。

また、単純に逆順に出力するなら、上であげたように

for(var i = 10; i > 0; i--)

この書き方でもできますが、廃止の可能性を考えると修正しておく方が無難。

for文を逆順で回したいのはどんな時か

さて、ここで本題。じゃあ一体どんな時に配列を逆から回したいでしょうか。
僕がぶちあたったのはこれです。
・for文の途中で配列の要素を削除したい時

例えば、先ほどのfor文で"ごりら"を削除してみます。

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
for index in 0..<array.count {
    if array[index] == "ごりら" {
        array.removeAtIndex(index)
    }
    print(array)
}

この文を実行すると「fatal error: Array index out of range」というエラーが。
removeAtIndexで要素を削除すると要素数が変化してしまい、存在しないindexまでアクセスしてしまうためですね。
これをどうすればよいか。逆から回せばよいのです。

for文を逆から回す

逆順で回すときは、

for index in (0...10).reverse() {
    print(index)
}

こんな感じで書けます。このfor文の出力結果は「10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0」です。

for index in (0..<10).reverse() {
    print(index)
}

こうすると「9, 8, 7, 6, 5, 4, 3, 2, 1, 0」となります。

ようやく本題。これらを応用すると、、、

for index in (0..<array.count).reverse() {
     if array[index] == "ごりら" {
        array.removeAtIndex(index)
     }
}
print(array)

この出力結果は「"りんご", "らっぱ", "ぱせり", "りーる"」となり、ごりらが削除できました。
お疲れ様でした。

補足

長々と書いておいてアレですが、配列の操作(今回の場合は削除)は、調べるとどうもfilterという関数を使えばクソ簡単に書けるようです。

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
array = array.filter($0 != "ごりら")
print(array)

出力結果["りんご", "らっぱ", "ぱせり", "りーる"]

複数削除したい場合はこんな感じ?

var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
let removeName  = ["ごりら", "りーる"]
for name in removeName {
    array = array.filter($0 != name)
}
print(array)

出力結果["りんご", "らっぱ", "ぱせり"]

削除というよりは条件に合わないものを再代入している形ですね。
調べればもっと短くなりそうです。
いやはや奥が深い。(この時間はなんだったんだ・・・)

お疲れ様でした。

34
29
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
29