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
相关产品推荐
相关产品推荐

