首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift 集合

Swift 集合

使用Map,filter,reduce对 swift 集合进行操作。

使用我们熟悉的 for-in 循环也是可以达到目的的,但是如果你掌握了这些特性,将会是你更方便对集合进行操作,是代码更加简洁。

Map

使用 map 遍历,他会对数组中每个数据进行操作,返回一个数组,对应相应的变换结果

使用原来的方法 for - in 方法

let values = [2.0, 4.0, 6.0, 8.0]

var result: [Double] = []

for value in values {

result.append(value*value)

}

使用map

let values = [2.0, 4.0, 6.0, 8.0]

let result = values.map { $0 * $0 }

解说:

map函数有一个参数,是一个闭包函数,在循环集合是调用它,这个闭包将集合的元素作为参数,并返回结果。map将这些结果放回到一个数组中。

let values = [2.0, 4.0, 6.0, 8.0]

let result = values.map { (value) -> Double in

return value * value

}

代码还可以简化成这样

let values = [2.0, 4.0, 6.0, 8.0]

let result = values.map { value in

return value * value

}

甚至我们可以省略 return

let values = [2.0, 4.0, 6.0, 8.0]

let result = values.map { value in

value * value

}

in关键字将参数从闭包体中分离出来。最后可以写成这样

let values = [2.0, 4.0, 6.0, 8.0]

let result = values.map { $0 * $0 }

结果的类型不限于原始数据的类型,下面这个是将整个类型映射到字符串类型

let numbers: [NSNumber] = [0, 4, 10]

let words = values.map {

NumberFormatter.localizedString(from: $0, number: .spellOut)

}

// ["zero", "four", "one hundred"]

map 不仅仅能操作数组,它也可以操作字典,然后返回一个数组

let dic = ["price": 100, "price2": 200]

let result = dic.map { $0.value * 10 }

// [1000, 2000]

如果你不知道闭包的参数类型,Xcode是会给与提示的,快速提示可以让你更明白参数到底是什么类型。

可以同时给如 Int 和 Double, map 会返回一个 Double 类型的数组

let values: Set = [2.0, 4.0, 8, 10]

let result = values.map { $0 * 3.14159 }

filter

使用filter, 会筛选符合条件的数据,匹配的数据包括进含有这些元素

filter 有一个指定包含条件的参数,这事一个闭包,他讲来自集合的元素作

为参数,他会返回一个Bool值。

let values: [Double] = [1.0, 2.0, 4.0, 11.0]

let result = values.filter { $0.truncatingRemainder(dividingBy: 2) == 0 }

// [2.0, 4.0]

reduce

使用 reduce ,可以集合中的所有项目合并来创建一个新值。

reduce 有两个值,一个初始化值,一个闭包值。

let values: [Double] = [1.0, 4.0, 6.0, 11.0]

let result = values.reduce(10) { $0 + $1}

初始化值:10 结果:32

let values: [Double] = [1.0, 4.0, 6.0, 11.0]

let result = values.reduce(0) { $0 + $1}

初始化值:0 结果:22

使用 reduce 可以连接字符串

let result = values.reduce("") { $0 + $1}

// 致技术公众号

FlatMap

flatMap 可以将一个一系列的集合,平铺开来。

let values = [[1,2],[3,4],[5,6]]

let result = values.flatMap { $0 }

// [1, 2, 3, 4, 5, 6]

flatMap 可以去掉数组中nil的元素

let device: [String?] = ["iPad", "iPhone", nil, "iMac", nil]

let validDevice = device.flatMap{ $0 }

// ["iPad", "iPhone", "iMac"]

对于在对一系列集合做平铺时,我们可以对结果进行筛选处理

let values = [[1,2],[3,4],[5,6]]

let result = values.flatMap {

$0.filter{ $0%2==0 }

}

// [2, 4, 6]

或者是

let values = [[1,2],[3,4],[5,6]]

let result = values.flatMap {

$0.map{ $0*$0 }

}

// [1, 4, 9, 16, 25, 36]

把一系列集合相加,最终的到一个值

let values = [[1,2],[3,4],[5,6]]

let result = values.map { $0.reduce(0, { $0 + $1} )}.reduce(0, {$0 + $1})

// 21

总结一哈:

返回一个包含将结果应用于每个项目的结果。

返回仅包含与包含条件相匹配的项目。

通过调用每个项目的组合闭包以初始值返回单个值。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180204G0ZJML00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券