You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何将满足isScheduled==true条件的数组元素移到首位

Swift 数组按指定条件移动元素到头部解决方案

需求说明

将ScheduleDateTime数组中所有isScheduled == true的元素移动到数组头部。

现有代码问题修正

你当前的代码存在两处需要调整的逻辑:

  • scheduleDateTime本身是值类型数组,if let scheduleList = scheduleDateTime得到的是数组的临时副本,修改副本不会同步到原数组
  • 正序遍历数组时如果执行移除元素操作会导致后续索引偏移,出现元素漏处理甚至崩溃

实现方案

方案1:符合条件的元素保持原有相对顺序排在前部(最常用)

使用Swift内置排序方法,所有isScheduled == true的元素排在前,相对顺序和原数组一致,false/nil的元素排在后:

struct ScheduleDateTime {
    var startDate: String?
    var endDate: String?
    var isScheduled: Bool?
}

var scheduleDateTime = [ScheduleDateTime]()

// 如果方法定义在结构体中,需要加mutating修饰以允许修改属性
mutating func reArrange() {
    scheduleDateTime.sort { lhs, rhs in
        // 可选型默认把nil当做false处理,你可以根据业务需求调整nil的优先级
        let lhsScheduled = lhs.isScheduled ?? false
        let rhsScheduled = rhs.isScheduled ?? false
        return lhsScheduled && !rhsScheduled
    }
}

方案2:后出现的符合条件元素排在最前

如果要求遍历到的符合条件元素逐个插入到最头部,最后遍历到的true元素位于数组最前,使用倒序遍历避免索引偏移问题:

mutating func reArrange() {
    // 倒序遍历不会受元素移除导致的索引变化影响
    for (index, item) in scheduleDateTime.enumerated().reversed() {
        guard item.isScheduled == true else { continue }
        let targetItem = scheduleDateTime.remove(at: index)
        scheduleDateTime.insert(targetItem, at: 0)
    }
}

内容的提问来源于stack exchange,提问作者kiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:54:02