基本方法行不通.

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

推荐答案

您的代码的问题在于,当list仍然具有其所有元素时,0 ..< list.count在循环开始时执行一次.每次删除一个元素时,list.count都会递减,但迭代范围不会修改.你最终会读得太多.

在Swift 4.1及以上版本中,可以使用compactMap来丢弃序列中的nil个元素.compactMap返回非可选值的array.

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

如果您仍然需要一个选项数组,可以使用filter删除nil个元素:

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

Ios相关问答推荐

iPhone:iOS 17.4中没有气压数据

Xcode版本15.2上未显示iOS 16.4的模拟器

当包含UITextView的inputAccessoryView显示键盘时,iOS UITableView内容会出现UINavigationBar奇怪的错误

围绕对象旋转和移动相机不起作用Swift SceneKit

用于HDR显示的CI上下文选项

清除/删除 NavigationController 中的多个 ViewController

ionic 4 - 编译 ios - 来自项目Pods的目标GoogleDataTransport中的问题

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

SwiftUI:通过Sheet将数据添加到Realm DB时视图不更新

SwiftUI - 使用切换switch 切换键盘类型(默认/数字)?

如何用 Swift 圆化 UILabel 的边缘

标题为 UIImage 的导航栏

iOS:以编程方式制作屏幕截图的最快、最高效的方法是什么?

关闭通过模态 segue 显示的视图

如何在 UILabel 中找到文本子字符串的 CGRect?

iTunes Connect 中的无限制 Web 访问是什么意思

如何在ios中生成UUID

UIView - 加载视图时如何获得通知?

如何找到 UILabel 的实际行数?

Xcode中的终端窗口?