相关疑难解决方法(0)

为什么在懒惰地评估过滤器(_ :)的谓词被调用了这么多次?

我看到一个答案了这个问题,它在它的第一个版本,也有类似的代码如下:

let numbers = Array(0 ..< 50)

let result = numbers.lazy
    .filter {
        // gets called 2-3x per element in the range (0...15)!
        print("Calling filter for: \($0)")
        return $0 % 3 == 0
    }
    .prefix(5)

print(Array(result)) // [0, 3, 6, 9, 12]
Run Code Online (Sandbox Code Playgroud)

通过使用惰性过滤器集合,它能够过滤numbers满足给定谓词的前5个元素(在这种情况下,可被3整除),而无需评估数组中的每个元素numbers.

然而,答案然后指出,filter(_:)每个元素可以多次调用谓词(范围1 ... 15中的元素为3次,结果为0时为2).

这种过滤器的惰性评估效率低下的原因是什么?有没有办法避免多次评估同一元素?

swift

9
推荐指数
1
解决办法
397
查看次数

如何获得符合"序列"的类型的计数?

假设我有这段代码:

func work<S: Sequence>(sequence: S) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我怎么能弄清楚有多少元素sequence
我想要的明显版本是非常低效的:

var count = 0
for element in sequence {
    count += 1
}
Run Code Online (Sandbox Code Playgroud)

必须有一个更好的方式,对吧?

count sequence swift

7
推荐指数
1
解决办法
3274
查看次数

标签 统计

swift ×2

count ×1

sequence ×1