用高阶函数重构给定的 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)
}
如何使用 map
、filter
或 reduce
等高阶函数重构 for-in 循环?如您所见,我依赖于索引变量,各种高阶函数似乎没有在各自的闭包中给我索引。
不幸的是,PHFetchResult 不能像 Swift 序列一样枚举(即 for...in
)。过去可以通过巧妙的手法做到这一点,但后来他们将 PHFetchResult 变成了通用的并毁了它。
这更令人沮丧,因为在 Objective-C 中,您 可以 用 for...in
枚举它。
在 Swift 中,您只需使用为此目的提供的 Cocoa 方法(或使用索引)。
"higher order functions"如map
、filter
等不适用于PHFetchResult
,assetsFetchResult
就是
]
你可以这样做:
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:))
给定以下代码:
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 循环?如您所见,我依赖于索引变量,各种高阶函数似乎没有在各自的闭包中给我索引。
不幸的是,PHFetchResult 不能像 Swift 序列一样枚举(即 for...in
)。过去可以通过巧妙的手法做到这一点,但后来他们将 PHFetchResult 变成了通用的并毁了它。
这更令人沮丧,因为在 Objective-C 中,您 可以 用 for...in
枚举它。
在 Swift 中,您只需使用为此目的提供的 Cocoa 方法(或使用索引)。
"higher order functions"如map
、filter
等不适用于PHFetchResult
,assetsFetchResult
就是
你可以这样做:
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:))