Swift 4根据条件和计数过滤数组

时间:2017-10-05 18:16:49

标签: ios arrays swift

class Bar {
    var data: Int = 0
    var sent = false
}

var fooArray: [Bar] = []

我有一系列定期发送到服务器的数据值。在服务器确认收到我的代码经过的数据并删除数组中发送的所有项目之后。我知道我可以使用简单的过滤器删除所有已发送的项目:

fooArray = fooArray.filter { $0.sent != true }

但是现在我想在数组中保留100个项目,无论它们是否已被发送。我知道我可以写一个循环来做这件事,但我想知道是否有更多的Swifty方式。

3 个答案:

答案 0 :(得分:0)

鉴于你上课(用大写字母B)

class Bar {
    var data = 0
    var sent = false
}

和一个数组

let bars: [Bar] = ...

您可以获得包含

的过滤数组
  1. 所有unsent bars
  2. 加上sent bars以达到100
  3. 这是代码

    let filtered = bars.reduce([Bar]()) { (res, bar) -> [Bar] in
        if !bar.sent || res.count < 100 {
            return res + [bar]
        }
        return res
    }
    

答案 1 :(得分:0)

如果我理解正确,您希望保留所有未发送的项目(即使超过100个),但也保留已发送项目的总数不超过100项。

如果不需要保留项目的顺序,您可以使用排序对首先放置未发送项目的项目进行分组,然后仅在它们位于100以下的位置时对它们进行过滤,保留已发送的项目。

fooArray = fooArray.sorted{($0.sent ? 1:0) < ($1.sent ? 1:0)} //unsent first
                   .enumerated()                              // get indexes
                   .filter{ !$1.sent || $0 < 100 } // keep unsent or below 100
                   .map{$1}

答案 2 :(得分:0)

您可以将数组分区为未发送和已发送的项目,然后取出前100个:

partition是一个变异函数,它接受一个闭包,确定哪些项目转到数组的第二部分。这会将所有已发送的项目推送到阵列的后面。然后,您可以获取此数组的前100个项目,这些项目将包含前面的未发送项目和阵列底部的已发送项目。如果少于100个项目,则显示整个数组。

fooArray.partition{ $0.sent }
fooArray = fooArray.prefix(100)