iOS_Swift高阶函数

这篇具有很好参考价值的文章主要介绍了iOS_Swift高阶函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

iOS_Swift高阶函数


1. 基础知识

1.1 定义

高阶函数:higher-order function
如果一个函数:

  • 接受一个或多个函数当作参数
  • 把一个函数当作返回值
    那么这个函数就被称做高阶函数。

例如:

let numbers = [1, 4, 2, 3]
let res = numbers.sort {
    $0 < $1
}

看着不像是函数作为参数,是因为 Swift 尾随闭包 Trailing Closure 的特性。Swift 允许当函数的最后一个参数是闭包时,可以以紧跟 { } 的形式,将最后一个闭包的内容附加在函数后面。

所以,以下两行代码是等价的:

// 正常写法,函数是作为 sort 的参数
arr.sort({ $0 < $1 })

// Trailing Closure 写法,更简洁明了
arr.sort { $0 < $1 }

1.2 闭包语法

// 完整语法
nums.map({ (value: Int) -> Int in return value * 2 })
// 闭包语法
nums.map{ (value: Int) -> Int in return value * 2 }
// 省略返回值类型
nums.map{ (value: Int) in return value * 2 }
// 省略参数类型
nums.map{ value in return value * 2 }
// 省略 return
nums.map{ value in value * 2 }
// 省略参数
nums.map{ $0 * 2 }

2. 高阶函数

2.1 map

2.1.1 集合类使用

遍历集合处理后,组成新的集合

// 将数组中的字符串转换为小写字母
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
print(lowercaseNames) // ["vivien", "marlon", "kim", "karl"]

// 获得数组中字符串的长度
let letterCounts = cast.map { $0.count }
print(letterCounts) // [6, 6, 3, 4]
2.1.2 Optional使用

Optional 也可以使用 map

let num: Int? = 2
var res = num.map { $0 * 2 }
print(res)

/// 而不需要像以下这样解包
if let num = num {
    res = num * 2
} else {
    res = nil
}
2.1.3 map 时获得 index

需要在 map 前使用 enumerated

let indexRes = cast.enumerated().map{ (index, element) in
    return "\(index):\(element)"
}
print(indexRes)

2.2 compactMap

ArraySet 使用 compactMap 可获得非空集合:

let possibleNumbers = ["1", "2", "three", "///4///", "5"]

let mapped = possibleNumbers.map { Int($0) }
print(mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)]

// compactMap 获得非 optional 元素
let compactMapped = possibleNumbers.compactMap { Int($0) }
print(compactMapped) // [1, 2, 5]

Dictionary 得用 compactMapValues 如下。


2.3 compactMapValues

Dictionary 使用 compactMapValues 可获得非空的键值对集合:

let dict = ["a": "1", "b": "three", "c": "///4///"]

let maped = dict.mapValues { Int($0) }
print(maped) // ["a": Optional(1), "b": nil, "c": nil]

let compactMaped = dict.compactMapValues { Int($0) }
print(compactMaped) // ["a": 1]

2.4 flatMap

flatMap 可将多维的集合,降低为一维:

let dict = ["Momo": [1, 2, 3], "Bibi": [4, 5, 6]]
let res1 = dict.map { $0.value }
print(res1) // [[4, 5, 6], [1, 2, 3]]

let res2 = dict.flatMap { $0.value }
print(res2) // [4, 5, 6, 1, 2, 3]

2.5 filter

filter 可过滤出符合条件的元素集合

// 过滤字符串长度小于5的
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames) // ["Kim", "Karl"]

2.6 reduce

reduce 可对集合遍历累积处理结果:

// 计算所有元素和
let numbers = [1, 2, 3, 4]
let res = numbers.reduce(0, { x, y in
    // 第一个参数为上次处理结果
    // 第二个参数为当前遍历到的元素
    x + y
})
print(res) // 10

3.练习

3.1 用 reduce 实现 map

let arr = [1, 3, 2]
let res = arr.reduce([]) { (a: [Int], element: Int) -> [Int] in
    var tmp = Array(a)
    tmp.append(element * 2)
    return tmp
}
// res = [2, 6, 4]

关键点:result 用数组


3.2 用 reduce 一次求出数组中奇数的和、以及偶数乘积

let arr = [1, 3, 2, 4]
let res: (Int, Int) = arr.reduce((0, 1)) { (a :(Int, Int), element: Int) -> (Int, Int) in
    if element % 2 == 0 {
        return (a.0, a.1 * element)
    } else {
        return (a.0 + element, a.1)
    }
}
// res = (4, 8)

关键点:result 用元组表示


3.3 使用高阶函数求一个数组中偶数的平方和

let arr = [1, 3, 2, 4]
let res = arr.filter {
        $0 % 2 == 0
    }.map {
        $0 * $0
    }.reduce(0) {
        $0 + $1
    }

Reference:
Apple Documentation for swift
Swift 烧脑体操(三) - 高阶函数
深入浅出Swift高阶函数-Map、Filter、Reduce
swift小知识点之高阶函数之map, filter, reduce文章来源地址https://www.toymoban.com/news/detail-444084.html

到了这里,关于iOS_Swift高阶函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java-IO流基础知识

    目录 1.File类与路径知识 1.File类 2.Java中的路径知识 3.创建File类的实例 4.File类的方法使用 5.File类使用的注意点 2.IO流知识 1.IO流原理 2.文件的读入 3.read()的重载方法:难点 4.文件的写出 1.写出的说明 2.写出操作的具体步骤 5.文件的复制:先读出在写入 6.字节流FileInputStream和Fi

    2024年02月09日
    浏览(34)
  • iOS设备和蓝牙模块连接基础知识

    iOS设备和蓝牙模块连接基础知识 一:iOS连接外设的几种方式 如图下面几种方式: CoreBluetooth和ExternalAccessory,两个框架,基本上是蓝牙设备与iOS设备连接的方式 有图可知,EAP要MFi认证,要求设备的设计理念符合苹果的要求,不仅可以进行无线蓝牙通信,还可以进行有线通信(

    2023年04月20日
    浏览(34)
  • Linux知识点 -- 基础IO(二)

    在上面的代码中,fprintf本来是向stdout中打印的,但是stdout关闭了,实际上fprintf事项fd是1的文件中打印,这里log.txt的fd就是1; 运行结果为: 这就叫做 输出重定向 ; 上面的代码将stdout关闭了,并打开log.txt文件,则log.txt文件的fd就是1; 在系统中,stdout就代表着fd为1,所以默

    2024年02月15日
    浏览(22)
  • 区块链基础知识——哈希函数

    哈希函数是一种数学函数,可根据输入的内容输出其对应的哈希值。散列函数的输入具有任意长度,但输出始终具有固定的长度。 散列算法的核心是一个数学函数,该散列函数构成散列算法的一部分,根据输入的数据块进行运算,得到的结果作为散列值。散列算法涉及多轮散

    2024年02月11日
    浏览(45)
  • C++ 从零基础到入门(3)—— 函数基础知识

    目录 一、函数简介 1、函数的作用和目的 2、函数的基本概念 二、函数定义与声明 1、函数定义的语法和结构 2、函数原型 三、参数传递 1、值传递 2、引用传递 3、指针传递 4、参数传递的选择 5.引用传递与指针传递的区别 四、返回值 1、返回类型 2、返回语句 在 C++ 中,函数

    2024年01月21日
    浏览(37)
  • FPGA基础知识-任务和函数

    目录 学习目标 学习内容 1.任务和函数的区别 2.任务 3.函数 学习时间 学习总结 1.理解任务和函数之间的区别。 2.理解定义任务所需的条件,学会任务的声明和调用。 3.理解定义函数所需的条件.学会函数的声明和调用。 提示:这里可以添加要学的内容      在 Verilog中,任务

    2024年02月10日
    浏览(28)
  • 【Linux】fork函数的基础知识

    文章目录 前言 一、fork的返回值 二、常见问题 1.为什么fork要给子进程返回0,给父进程返回子进程pid? 2.一个函数返回两次值怎么理解? 3.一个变量怎么会有不同的内容? 4.fork函数干了什么? fork初识: 1.fork有两个返回值。 2.父子进程代码共享,数据各开辟空间,私有一份(

    2024年02月10日
    浏览(29)
  • 【03】基础知识:typescript中的函数

    函数声明法 函数表达式/匿名函数 1、typescript 中定义函数传参 函数声明 函数表达式/匿名函数 2、可选参数 在 es5 中,方法的形参和实参个数可以不一样;但是在 ts 中必须一样,如果不一样就需要配置可选参数。 ts 中 通过【 形参?: 数据类型 】形式定义可选参数,代表该参数

    2024年02月13日
    浏览(30)
  • c语言基础知识帮助理解(详解函数)

    目录 1. 函数是什么 2. 库函数  3. 自定义函数  4. 函数参数  4.1实际参数(实参)  4.2形式参数(形参)  5.函数的调用 5.1传值调用 5.2传址调用 (传递地址) 6. 函数的嵌套调用和链式访问  6.1 嵌套调用  6.2 链式访问  7. 函数的声明和定义  7.1 函数声明  7.2函数定义 函数是

    2024年02月14日
    浏览(29)
  • C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

    🌠 例1: #include iostream 标准输入输出 std 是 c++ 标准库的命名空间,将标准库的定义实现都放到这个命名空间中 using namespace std 展开 std 里的内容 cout   c 代表的是 console 控制台的意思, out 有输出的意思 流运算符 流插入 endl 等价于 \\\'n\\\' 在 c++ 中,变量、函数和类的名称存在于

    2024年02月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包