/*
使用了 map、 filter 和 reduce 的小实例。
假设我们有下面这样的结构体,其定义由城市的名字和人口 (单位为千居⺠) 组成:
*/
struct City {
let name: String
let population: Int
}
let paris = City(name: "Paris", population: 2241)
let madrid = City(name: "Madrid", population: 3165)
let amsterdam = City(name: "Amsterdam", population: 827)
let berlin = City(name: "Berlin", population: 3562)
let cities = [paris, madrid, amsterdam, berlin]
/*
假设我们现在想筛选出居⺠数量至少一百万的城市,并打印一份这些城市的名字及总人口数的列表。我们可以定义一个辅助函数来换算居⺠数量:
*/
extension City {
func cicyByScalingPopulation() -> City {
return City(name: name, population: population * 1000)
}
}
let cititesAllpop =
cities.filter { $0.population > 1000 }
.map { $0.cicyByScalingPopulation() }
.reduce("City: Population") { result, c in
return result + "\n" + "\(c.name): \(c.population)"
}
//过滤 -> 转换 -> 相加
/* 另外:
flatMap
很像map
函数,但是它摒弃了那些值为nil 的元素。另外一个与map
函数不同之处在于:倘若元素值不为nil情况下,flapMap
函数能够将可选类型(optional)转换为非可选类型(non-optionals)
*/
print(cititesAllpop)
//遍历 不操作 .forEach
/*
// =
City: Population
Paris: 2241000
Madrid: 3165000
Berlin: 3562000
我们首先将居⺠数量少于一百万的城市过滤掉。然后将剩下的结果通过 cityByScalingPopulation 函数进行 map 操作。最后,使用 reduce 函数来构建一个包含城市 名字和人口数量列表的 String。这里我们使用了 Swift 标准库中 Array 类型的 map、 lter 和 reduce 定义。于是,我们可以顺利地链式使用过滤和映射的结果。表达式 cities . lter (..) 的 结果是一个数组,对其调用 map;然后这个返回值调用 reduce 即可得到最终结果。
*/
网友评论