Swift 知识 高阶函数 forEach filter map compactMap compactMapValues flatMap reduce sort sorted shuffled ...

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

高阶函数的使用为我们在开发过程中提供了很大的方便,使用起来也很方便,只要用熟了之后确实感觉很好用。

正题

forEach: 遍历

例如:用于修改模型中(符合条件)的值,例如:勾选购物车中的商品,选中的就打钩。
在这里插入图片描述
再举一个简单的例子:修改模型中的值
在这里插入图片描述

filter:筛选(常用)

struct Student {
    let id: String
    let name: String
    let 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 in
    student.age >= 12
}
print("addDucts: \(addDucts)")

map:提取+转换(常用)

1.处理数组中的每个元素,并返回⼀个新的结果数组
2.它的作用一般在开发过程中用来转换当前模型,返回一个新的数组。
//map
struct Student {
    let id: String
    let name: String
    let 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 in
    Int(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:(处理数组) /kəmˈpækt /契约

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: String
    let name: String
    let 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) in
    Int(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? in
    return 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? in
    return "\(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? in

    if 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: String
    let name: String
    let 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 in
    return result + student.age
}
print("totalAges: \(totalAges)")//totalAges: 36

高阶函数的组合使用

例子1:
//将 String 类型映射为 Int 类型,并查找id大于1002的所有学生
let adults = students.compactMap { (stu) in
    Int(stu.id)
    }.filter { (id) -> Bool in
        id > 1
}

print(adults) //[2, 3]
例子2:
//计算年龄大于12的所有学生年龄总和
let totalAge = students.filter { (student) -> Bool in
    student.age > 11
    }.reduce(0) { (result, student) in
        return result + student.age
}

print(totalAge) // 25

sort() 排序 /sɔːt/ 分类

从小到大排序 改变原来数组的顺序 不会产生新的数组

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 in
    return 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 in
    return 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 数组转换成字符串拼接在一起。/dʒɔɪnd/ 已加入

let list = ["1","2","3"];
let title = list.joined(separator: " * ")
print("\(title)")

在这里插入图片描述

contains 是否包含. /kənˈteɪnz/ 包含

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)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯汉栩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值