前にはてなに書いていた記事の焼き直しなのですが、Swiftの配列でNSMutableArrayのremoveObject:と同じことが出来ないものかと悩んだときの共有です。もっといい方法があったら教えてほしいです。
関数が無い
良く、Swiftで実装をしていると、ある配列(リスト)から特定のオブジェクトを削除したくなる時がありませんでしょうか? Objective-Cで言うところのNSMutableArrayクラスの”removeObject:”。Swiftでは関数が無く安直に移植が出来ませんでした。
それっぽくやってみる
Swiftの配列には”remove(at:)”というindexを指定して、そこにあるオブジェクトを削除する関数は用意されています。とりあえず、これを使ってみましょうか。
let index = array.index(where: { (each) in
return each === butsu
})
if index != nil {
array.remove(at: index!)
}
arrayが配列です。”index(where:)”を使って、butsuが入っているindexを探します。で、そのindexを使って”remove(at:)”で消しにかかる。なんだか遠回しですね。
ちょっと違うけど
配列の参照が変わってしまうと思いますが、もう一つやり方があります。
let removed = array.filter { (each) -> Bool in
return each !== butsu
}
フィルターを使うのですが、removedにbutsuが除かれた配列が返ってきます。こっちの方が見た目はスッキリしますかね。
終わりに
標準の関数がもうちょっとあるといいですね。他に良い方法がありましたら教えて頂けるとありがたいです。こんな方法でやってるぜ!! みたいな。。。
追記(2020/01/26)
現在、Swiftのバージョンは5になっていますが、”index(where:)”はDeprecatedになっていて、代わりに”firstIndex(where:)”を使うようになっているみたいですね。
let index = array.firstIndex(where: { (each) in
return each === butsu
})
if index != nil {
array.remove(at: index!)
}
こんな感じ