はじめに
独学でプログラミング学び始めて約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)
出力結果:["りんご", "らっぱ", "ぱせり"]
削除というよりは条件に合わないものを再代入している形ですね。
調べればもっと短くなりそうです。
いやはや奥が深い。(この時間はなんだったんだ・・・)
お疲れ様でした。