1. ホーム
  2. ios

Swift の配列ですべての nil 要素を削除するにはどうすればよいですか?

2023-08-30 14:31:03

質問

基本的な方法がうまくいきません。

for index in 0 ..< list.count {
    if list[index] == nil {
        list.removeAtIndex(index) //this will cause array index out of range
    }
}

どのように解決するのですか?

あなたのコードの問題点は 0 ..< list.count がループの最初で一度実行され、その後 list がまだすべての要素を持っているときに実行される。要素を一つ削除するたびに list.count はデクリメントされますが、反復範囲は変更されません。結局、読みすぎてしまうのです。

Swift 4.1以上では、以下のように compactMap を破棄するために nil の要素を破棄する。 compactMap は任意でない値の配列を返す。

let list: [Foo?] = ...
let nonNilElements = list.compactMap { $0 }

それでもオプションの配列が必要な場合は filter を削除して nil 要素を削除します。

list = list.filter { $0 != nil }