背景
SwiftとFirebaseを使ってマッチングアプリを作っていたところ、不正ユーザーをブロックする機能を実装する必要が出てきました。
そして、タイトルにもあるように、「配列から複数の要素を削除する方法」が必要になったのでその方法を自分なりに考えてみました。
方針
array1からarray2と重複する要素を除去します。
実際の環境では、自分以外の全ユーザーのドキュメントIDをDBから取得して配列(array1)とし、ブロックしたユーザーのドキュメントIDをDBから取得して配列(array2)として、array1からarray2の要素を除去することで、ブロックしていないユーザーのドキュメントIDからなる配列を取得します。
具体的な方法
var array1 = ["a","b","c","d","e","f"]
var array2 = ["a","d","e"]
var duplicateIndexs:[Int] = []
var count = 0
for i in 0..<array1.count {
if array2.contains(array1[i]){
duplicateIndexs.append(i)
}
}
print(duplicateIndexs) // [0, 3, 4]
for i in 0..<duplicateIndexs.count{
array1.remove(at: duplicateIndexs[i] - count)
count += 1
}
print(array1) // ["b", "c", "f"]
補足
duplicateIndexsとか、countとかなんかごちゃごちゃやっているなという感じですが、
単に以下のコードだとIndex out of rangeのエラーが出ます。
var array1 = ["a","b","c","d","e","f"]
var array2 = ["a","d","e"]
for i in 0..<array1.count {
if array2.contains(array1[i]){
array1.remove(at: i)
}
}
print(array1)
removeで除去しつつfor文を回しているので、array1が短くなっていき(要素が減っていき)、array1[i]の部分がIndex out of rangeになるんですね。
このエラーを避けるために、duplicateIndexsとか、countとか用意してなんとか目的の、array2の要素を除去した新たな配列を取得することに成功しました。
「もっと他にいい実装方法あるよ」という意見やアドバイスをいただけると幸いです!