用高阶函数重构给定的 for-in 循环

Refactoring the given for-in loop with a higher order function

给定以下代码:

let assetsFetchResult = PHAsset.fetchAssets(in: panoramasCollection, options: fetchOptions)
private var pAssets = [PHAsset]()
for i in 0..<assetsFetchResult.count {
    let asset = assetsFetchResult.object(at: i)
    pAssets.append(asset)
}

如何使用 mapfilterreduce 等高阶函数重构 for-in 循环?如您所见,我依赖于索引变量,各种高阶函数似乎没有在各自的闭包中给我索引。

不幸的是,PHFetchResult 不能像 Swift 序列一样枚举(即 for...in)。过去可以通过巧妙的手法做到这一点,但后来他们将 PHFetchResult 变成了通用的并毁了它。

这更令人沮丧,因为在 Objective-C 中,您 可以 for...in 枚举它。

在 Swift 中,您只需使用为此目的提供的 Cocoa 方法(或使用索引)。

"higher order functions"如mapfilter等不适用于PHFetchResultassetsFetchResult就是

]

你可以这样做:

private var pAssets = [PHAsset]()
assetsFetchResult.enumerateObjects { (asset, index, stop) in
    pAssets.append(asset)
}

是的,你可以的!但是您需要范围,因为 PHFetchResult 不是集合。

let assetsFetchResult = PHAsset.fetchAssets(in: panoramasCollection, options: fetchOptions)
private var pAssets = (0..<assetsFetchResult.count).map(assetsFetchResult.object(at:))