Swift|Swift 基础 —— 关于数组操作
一、 自定义数组的累加操作,并返回一个数组。
和reduce类似,只不过reduce返回的是一个元素,而不是数组。
// reduce 用法
let nums = [1, 2, 3, 4]
let sumNums = nums.reduce(1, +) //11
- 首先自定义:
extension Array {
/// 返回所有元素合并到一个数组中,保留合并时的每一步的值
///
/// - Parameters:
///- initialResult: 初始值
///- nextParticalResult: 操作
/// - Returns: 累加的过程数组
func accumulate(_ initialResult: Result, _ nextParticalResult: (Result, Element) -> Result) -> [Result] {
var running = initialResult
return map { (next) in
running = nextParticalResult(running, next)
return running
}
}
}
- 使用
let nums = [1, 2, 3, 4]
let accumulateNums = nums.accumulate(1, +)// [2, 4, 7, 11]
- nums.accumulate(1, +) 来源
// accumulate的第二个参数是一个闭包,所以可以写成尾随闭包形式。也可以不使用尾随闭包
let accumulateNums = nums.accumulate(1) { (num1, num2) -> Int in
return num1 + num2
}// nums数组的操作后的返回类型可以自动推断,可以省略返回类型
let accumulateNums = nums.accumulate(1) { (num1, num2) in
num1 + num2
}// 使用默认参数
let accumulateNums = nums.accumulate(1) { $0 + $1 }// 如果有两个参数,那么对这两个参数进行操作,可以省略掉参数。此时不能使用尾随闭包,比较清晰
let accumulateNums = nums.accumulate(1, +)
二、 检查数组内是否所有元素都满足某个条件
- 定义
/// 返回是否数组内所有元素满足条件
///
/// - Parameter predicate: 条件
/// - Returns: 是否数组内所有元素满足条件
func all(matching predicate:(Element) -> Bool) -> Bool {
return !contains { !predicate($0) }
}
- 用法
let nums = [1, 2, 3, 4]
let isBiggerThan0 = nums.all { $0 > 0} // true
三、map函数用reduce的实现
- 实现方式
【Swift|Swift 基础 —— 关于数组操作】首先参考一下reduce的实现方式
func reduce(_ initialResult: Result, _ nextPartialResult: (Result, Element) -> Result) -> Result {
var result = initialResult
for x in self {
result = nextPartialResult(Result, x)
}
return result
}
再看map的实现就容易了。map 返回的是一个数组。即用一个初始为空的数组,每次加上数组中元素变换过的元素,返回的是一个数组。
func map2(_ transform: (Element) -> T) ->[T] {
return reduce([]) {
$0 + [transform($1)]
}
}
// reduce 两个参数,一个初始值,一个闭包,闭包中有两个参数,累计的result 和 array中的element。
//result = []
// for x in array
// result = result + [transfrom(x)]// 这里$1 表示的是array中的元素
- 使用
let nums = [1, 2, 3, 4]
let reduceNum = nums.map2 { $0 * $0 }
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术