给出以下代码:
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)
}
如何使用更高阶函数(例如map
,filter
或reduce
重构for-in循环?正如您所看到的,我依赖于索引变量,而各种高阶函数似乎并没有在各自的闭包中给出索引。
答案 0 :(得分:1)
不幸的是,PHFetchResult不能被枚举为好像是一个Swift序列(即for...in
)。曾经有可能通过巧妙的手法做到这一点,但随后他们将PHFetchResult变成了一个通用的并破坏了它。
这更令人沮丧,因为在Objective-C中你可以用for...in
枚举它。
在Swift中,您只需使用为此目的提供的Cocoa方法(或使用索引)。
答案 1 :(得分:1)
map
,filter
等“高阶函数”不适用于PHFetchResult
,assetsFetchResult
。
你可以这样做:
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:))