Swift 基础 高阶函数 forEach filter map compactMap compactMapValues flatMap reduce sort sorted shuffled ...
一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。
前言
高阶函数的使用为我们在开发过程中提供了很大的方便,使用起来也很方便,只要用熟了之后确实感觉很好用。
正题
forEach: 遍历
例如:用于修改模型中(符合条件)的值,例如:勾选购物车中的商品,选中的就打钩。
再举一个简单的例子:修改模型中的值
filter:筛选(常用)
struct Student {let id: Stringlet name: Stringlet age: Int
}let student1 = Student(id: "1", name: "student1", age: 11)
let student2 = Student(id: "2", name: "student2", age: 12)
let student3 = Student(id: "3", name: "student3", age: 13)
let students = [student1, student2, student3]//filter
//这个函数就如同单词的意思:查找。将符合条件的元素查找出来放置在数组中返回。比如我们想查找年龄大于18岁的所有学生
let addDucts = students.filter { (student) -> Bool instudent.age >= 12
}
print("addDucts: \(addDucts)")
map:提取+转换(常用)
1.处理数组中的每个元素,并返回⼀个新的结果数组
2.它的作用一般在开发过程中用来转换当前模型,返回一个新的数组。
//map
struct Student {let id: Stringlet name: Stringlet age: Int
}let student1 = Student(id: "1", name: "student1", age: 11)
let student2 = Student(id: "2", name: "student2", age: 12)
let student3 = Student(id: "3", name: "student3", age: 13)
let students = [student1, student2, student3]let intStudents = students.map { student inInt(student.id)
}print("intStudents \(intStudents)")//intStudents [Optional(1), Optional(2), Optional(3)]
map也可以用来处理元素
let num: Int? = 2
let result = num.map {$0 * 2
}print("result: \(result ?? 0)")//result: 4
compactMap:(处理数组)
compactMap是swift4.1的时候推出的Api,把可以说是用来替换flatMap,compactMap使用起来比flatMap更加灵活:
在Swift标准库中compactMap定义如下
public func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
在Swift标准库中flatMap定义如下
public func flatMap(_ transform: (Element) throws -> String?) rethrows -> [String]
从定义可以看出,经过flatMap后一定变成字符串数组,而compactMap是任意类型的数组。从而compactMap使用更加灵活。
用来筛选出符合条件的数据,返回一个新的数组:
例子1:提取
struct Student {let id: Stringlet name: Stringlet age: Int
}let student1 = Student(id: "1", name: "student1", age: 11)
let student2 = Student(id: "2", name: "student2", age: 12)
let student3 = Student(id: "3", name: "student3", age: 13)
let students = [student1, student2, student3]//compactMap 对于 Set 和 Array ,你可以使用 compactMap
let intIds = students.compactMap { (student) inInt(student.id)
}
print("intIds: \(intIds)")//intIds: [1, 2, 3]
例子2:过滤
let nums = [0, nil, 1, nil, 2, nil, 3, nil, 4, nil, 5]
let result = nums.compactMap { (item) -> Int? inreturn item
}
print(result) // [0, 1, 2, 3, 4, 5]
化简的写法:
let result = nums.compactMap { return $0 }
print(result) // [0, 1, 2, 3, 4, 5]
例子3:类型转换
let list = [1, 2, 3, 4, 5]
let newList = list.compactMap { (element) -> String? inreturn "\(element)"
}
print(newList) // ["1", "2", "3", "4", "5"]
化简的写法:
let list = [1, 2, 3, 4, 5]
let newList = list.compactMap {return "\($0)"}
print(newList) // ["1", "2", "3", "4", "5"]
例子4:筛选数据
let list = [28, 54, 36, 62, 44, 33]
let result = list.compactMap { (element) -> Int? inif element%4 == 0 {return element}return nil
}
print(result) // [28, 36, 44]
compactMapValues (处理字典)
let dictionary = ["key1":10, "key2":20, "key3":nil]
let results = dictionary.compactMapValues{ $0 }
print("result: \(results)")//result: ["key2": 20, "key1": 10]
flatMap:映射扁平化(处理完一定返回字符串)
//flatMap
let scoreByName = ["henk":[0,5,8], "john":[2,5,8]]
let mapped = scoreByName.map { $0.value }
print("mapped: \(mapped)")//mapped: [[2, 5, 8], [0, 5, 8]]let flatMapped = scoreByName.flatMap { $0.value}
print("flatMapped: \(flatMapped)")//flatMapped: [2, 5, 8, 0, 5, 8]//map 会直接将元素放在数组中,而 flatMap 会将元素平铺在一个数组中。实际上,s.flatMap(transform) 等同于s.map(transform).joined()。
reduce (组合运算)
struct Student {let id: Stringlet name: Stringlet age: Int
}let student1 = Student(id: "1", name: "student1", age: 11)
let student2 = Student(id: "2", name: "student2", age: 12)
let student3 = Student(id: "3", name: "student3", age: 13)
let students = [student1, student2, student3]//对于 reduce,我们的使用场景就是对数组中的元素进行组合运算,比如我们想计算所有学生的年龄加载一起是多少。
let totalAges = students.reduce(0) { result, student inreturn result + student.age
}
print("totalAges: \(totalAges)")//totalAges: 36
高阶函数的组合使用
例子1:
//将 String 类型映射为 Int 类型,并查找id大于1002的所有学生
let adults = students.compactMap { (stu) inInt(stu.id)}.filter { (id) -> Bool inid > 1
}print(adults) //[2, 3]
例子2:
//计算年龄大于12的所有学生年龄总和
let totalAge = students.filter { (student) -> Bool instudent.age > 11}.reduce(0) { (result, student) inreturn result + student.age
}print(totalAge) // 25
sort() 排序
从小到大排序 改变原来数组的顺序 不会产生新的数组
var list = [6,8,4,0,2,5,3,7,9,1];
list.sort()
print(list)
sorted() 排序
从小到大排序。 不改变原来数组的顺序。 会产生新的数组
var list = [6,8,4,0,2,5,3,7,9,1];
let arr = list.sorted()
print(arr)
sort(by: ) 排序
根据指定的法则 排序。 改变原来数组的顺序。 不会产生新的数组
var list = [6,8,4,0,2,5,3,7,9,1];
//根据指定的法则 排序。 改变原来数组的顺序。 不会产生新的数组
list.sort { num_0, num_1 inreturn num_0 > num_1 ? true : false
}
print(list)
sorted(by: ) 排序
var list = [6,8,4,0,2,5,3,7,9,1];
let arr = list.sorted { num_0, num_1 inreturn num_0 > num_1 ? true : false
}
print(arr)
shuffled 打乱数组
var list = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list.shuffled()
print(list)
joined 数组转换成字符串拼接在一起
let list = ["1","2","3"];
let title = list.joined(separator: " * ")
print("\(title)")
contains 是否包含
let arr = [1,2,3,4,5]
print("是否包含:\(arr.contains(1))")
prefix() 截取前面
let arr = [1,2,3,4,5]
print("截取前面:\(arr.prefix(2))")//不包含截取的位置
prefix(upTo: ) 截取指定值前面
let arr = [1,2,3,4,5]
print("截取指定值前面:\(arr.prefix(upTo: 3))")//包含截取的位置
suffix() 截取后面面
let arr = [1,2,3,4,5]
print("截取后面面:\(arr.suffix(2))")//不包含截取的位置
suffix(from: ) 截取指定值后面
let arr = [1,2,3,4,5]
print("截取指定值后面:\(arr.suffix(from: 1))")//不包含截取的位置
dropFirst 返回的是除首元素之外的片段
let array = [1,2,3,4]
print(array.dropFirst())//输出[2,3,4]
print(array.dropFirst(2))//输出[3,4]
dropLast 返回的是除尾元素之外的片段
let array = [1,2,3,4]
print(array.dropLast())//输出[1,2,3]
print(array.dropLast(2))//输出[1,2]
joined(separator: " • ") 数组转换字符串
规定是字符串数组
let arr = ["1","2","3","4","5"]
let string = arr.joined(separator: " • ")
print(string)
firstIndex(where: ) 寻找符合条件的元素并返回数组的index
let index = list.firstIndex(where: {$0.age == 20})
print(index ?? 999)
Swift 基础 高阶函数 forEach filter map compactMap compactMapValues flatMap reduce sort sorted shuffled ...相关推荐
- Swift的高阶函数
Swift的高阶函数 swift常用高阶函数 1. map 2. flatMap 3. filter 4. reduce swift常用高阶函数 swift中比较常用的高阶函数有:map.flatMa ...
- Swift 常用高阶函数
Swift 常用高阶函数 map函数 对每一个元素进行运算 计算每一个元素的count 对元素进行大小写变换 转换类型 sorted函数 从小到大排序 从大到小排序 flatMap函数 降维 过滤元素 ...
- python高阶函数filter_python 高阶函数之filter
前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...
- python高阶函数、map reduce 自己如何去定义_小猿圈python之高阶函数lambda、map和reduce用法...
python有很多内置函数,内置函数封装了很多功能,让我们用起来很方便,小猿圈针对高阶函数有详细的讲解视频,朋友们可以去看看,小编学后总结了一下,下面说一下lambda.map和reduce高阶函数的 ...
- Python之常用的高阶函数——abs、map、reduce、filter、sorted
1.abs 简单来说abs的功能就是求一个数的绝对值 例: 特点: <1>函数本身也可以赋值给变量,变量也可以指向函数 <2>传递的参数包括函数名 2.map map()函数接 ...
- Javscript 高阶函数(上)
Javscript 高阶函数(上) filter map reduce reduce 实现compose 什么是compose 面向过程的实现 generator实现 总结 对于ES6的语法的引入,很 ...
- Kotlin学习三:高阶函数
目录 一.高阶函数的基本概念 二.常见高阶函数 1.关于list映射 2.flatMap 3.综合1 4.综合2 三.尾递归优化 四.闭包 五.函数复合 六.科理化 七.偏函数 八.小案例 一.高阶函 ...
- 【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )
文章目录 I . List 集合高阶函数引入 II . Kotlin 数据类 ( data class ) III . Java 代码 与 Kotlin 代码实现对比 ( 查询年龄最大的 ) IV . ...
- Python函数详解:函数定义、调用,lambda函数,高阶函数map,filter,reduce,函数式编程,模块化设计、代码复用、函数递归、enumerate()
一.函数 函数是一段具有特定功能的.可重用的语句组,通过函数名来表示和调用. 函数是一段代码的抽象和封装 函数是一段具有特定功能的.可重用的语句组 函数是一种功能的抽象,表达特定功能 两个作用:降低编 ...
最新文章
- 2018.10.22-dtoi1443奶牛逃亡(cowrun)
- 使用Ubuntu 12.04作为日常电脑环境
- 在 asp.net core \ vs2015 update2 情况况下创建 asp.net core web application 的问题
- Android --- 刚刚进入 Activity 页面的时候无法打开对话框,报错 Unable to add window -- token null is not valid; is your
- c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践
- RocketMq namesvr 最佳实践
- java getstringbounds_java-AttributedString的FontMetrics.getStringBounds给出...
- 基于Token进行身份验证
- MySQL优化大总结
- C 与 JAVA 的对比分析
- mac上实时运行linux系统,使用Darling模拟器实现在Linux上运行Mac OS X程序
- python交互式shell之jupyter notebook初步安装使用
- Python3爬虫项目集:豆瓣电影排行榜top250
- Js 获取浏览器高度
- Android截屏工具类的使用
- php那好,php那好【货币问答】- php那好所有答案 - 联合货币
- php dtu,什么是DTU DTU知识普及基础篇
- 第16章 起舞不落幕——与纹理映射的华丽邂逅
- 你阳了吗?可以接种最新加强针疫苗了!
- 阿丹学理财之房产投资
热门文章
- 如何用 Roam Research 备课?
- Android:开发中,代码被横线划掉是什么意思
- Opencv中的图像相加,相减,相除,相乘(python实现)
- 获取Jenkins项目名称
- 【操作说明】全能型H.265播放器如何使用
- 关于Navicat Premium连接Oracle数据库闪退(失败)的解决办法(带ocl.dll)
- PHP 合成图片并在图片上加文字
- 100天带你系统入门VR/AR游戏开发,成为5G时代的“头号玩家”
- PostgreSQL 各种查询
- ftp linux 推送文件_Linux文件传输FTP详解