45

したがって、次のような for ループがあります。

for var i = 0; i < results.count ; i += 1 {
   if (results[i] < 5) {
      results.removeAtIndex(i)
      i -= 1
   }
}

これは以前は機能していました。しかし、優先する Swift 3.0 構文に変更すると、次のようになります。

for var i in 0..<results.count {
   if (results[i] < 5) {
      results.removeAtIndex(i)
      i -= 1
   }
}

カウントを再チェックせず、元のresults.count.

これを修正するにはどうすればよいですか? 今はうまくいっていますが、将来トラブルに巻き込まれたくありません。

4

4 に答える 4

76

を使用するソリューションfilterは優れたソリューションであり、よりSwift-lyfor-inですが、それでもなお使用が必要な場合は、別の方法があります。

func removeBelow(value: Int) {
    var results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    for i in (0 ..< results.count).reversed() {
        if (results[i] < value) {
            results.remove(at: i)
        }
    }

    print(results)
}

removeBelow(value: 5)

結果:

[5, 6, 7, 8, 9, 10]

removeAtIndexループ内の問題は、配列がインプレースでcount再インデックス付けされないため、更新されないために範囲外の配列例外が発生することです。

逆方向にトラバースすることで、範囲外の例外を回避できます。

于 2016-06-03T23:40:02.267 に答える
18

filter代わりにa を使用できますか?

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let greaterThan4 = numbers.filter{$0 >= 5}
print(greaterThan4)
于 2016-06-02T15:29:15.917 に答える
13

ループを引き続き使用する場合は、次を使用forしてインデックスと要素の両方を列挙できますenumerate

for (index, element) in results.enumerate() {
   if (element < 5) {
     results.removeAtIndex(index)
   }
}

ループで何をしているかにもよりますが、このfilter方法の方が良い考えかもしれません。

于 2016-06-02T15:33:39.197 に答える