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

时间:2018-06-14 03:26:56

标签: ios swift functional-programming photosframework

给出以下代码:

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循环?正如您所看到的,我依赖于索引变量,而各种高阶函数似乎并没有在各自的闭包中给出索引。

3 个答案:

答案 0 :(得分:1)

不幸的是,PHFetchResult不能被枚举为好像是一个Swift序列(即for...in)。曾经有可能通过巧妙的手法做到这一点,但随后他们将PHFetchResult变成了一个通用的并破坏了它。

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

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

答案 1 :(得分:1)

mapfilter等“高阶函数”不适用于PHFetchResultassetsFetchResult

你可以这样做:

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

答案 2 :(得分:1)

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

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