iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >深入浅出的聊聊Swift高阶函数
  • 937
分享到

深入浅出的聊聊Swift高阶函数

2024-04-02 19:04:59 937人浏览 安东尼
摘要

目录初探高阶函数mapcompactMapcompactMapValuesflatMapfilterreduce组合使用总结初探高阶函数 在 Swift 中,高阶函数一共有下面几个

初探高阶函数

在 Swift 中,高阶函数一共有下面几个:

  • map:对给定数组每个元素,执行闭包中的映射,将映射结果放置在数组中返回。
  • flatMap:对给定数组的每个元素,执行闭包中的映射,对映射结果进行合并操作,然后将合并操作后的结果放置在数组中返回。
  • compactMap:对给定数组的每个元素,执行闭包中的映射,将非空的映射结果放置在数组中返回。
  • compactMap对给定数组的每个元素,执行闭包中的映射,将非空的映射结果-键值对放置在字典中返回。
  • filter:对给定数组的每个元素,执行闭包中的操作,将符合条件的元素放在数组中返回。
  • reduce:对给定数组的每个元素,执行闭包中的操作对元素进行合并,并将合并结果返回。

通过上面的阐述,我们大概了解到了这几个函数是做什么用的,下面我们在通过几个例子来具体看一下代码上如何使用。

map

对于 map 函数,使用场景就是将数组的类型映射为别的类型。比如,我们有一个模型数组,模型的 id 字段我们从服务器拿的是 String 类型,在某种场景下我们需要转为 Int 类型,这时候我们就可以通过 map 函数来实现该需求。


struct Student {
    let id: String
    let name: String
    let age: Int
}
 
let stu1 = Student(id: "1001", name: "stu1", age: 12)
let stu2 = Student(id: "1002", name: "stu2", age: 14)
let stu3 = Student(id: "1003", name: "stu3", age: 16)
let stu4 = Student(id: "1004", name: "stu4", age: 20)
let stus = [stu1, stu2, stu3, stu4]
 
let intIds = stus.map { (stu) in
    Int(stu.id)
}
 
print(intIds) //[Optional(1001), Optional(1002), Optional(1003), Optional(1004)]

通过上述代码,我们将 id 字段从 String 映射为了 Int? 类型,这并不是我们想要的 Int 类型。如果我们需要访问元素的话还得需要解包,那么我们如何既能将元素映射又能自动筛选 nil 的值呢?这时,就轮到 compactmap 出马了。

compactMap

我们将上面的代码替换为:


 let intIds = stus.compactMap { (stu) in
     Int(stu.id)
   }

这时,我们再打印 intIds 就会发现它已经为 Int 类型了。

compactMapValues

对于 Set 和 Array ,你可以使用 compactMap 来获得非空的集合,但是对于 Dictionary 来说,这个函数是不起作用的。


let dict = ["key1": 10, "key2": nil]
let result = dict.compactMap { $0 }
print(result) //[(key: "key1", value: Optional(10)), (key: "key2", value: nil)]

这时候,我们需要使用 compactMapValues 函数来获得非空的字典。


  print(result) //["key1": 10]
 let result = dict.compactMapValues { $0 }
 print(result) //["key1": 10]

flatMap

对于 flatMap,主要的应用场景就是你想获得一个单层集合的数组。通过下面的代码来看一下 map 和 flapMap 的区别。


  let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]]

  let mapped = scoresByName.map { $0.value }
  // [[2, 5, 8], [0, 5, 8]]
  print(mapped)

 let flatMapped = scoresByName.flatMap { $0.value }
  // [2, 5, 8, 0, 5, 8]

map 会直接将元素放在数组中,而 flatMap 会将元素平铺在一个数组中。实际上,s.flatMap(transfORM) 等同于s.map(transform).joined()。

filter

这个函数就如同单词的意思:查找。将符合条件的元素查找出来放置在数组中返回。比如我们想查找年龄大于18岁的所有学生。


let adults = stus.filter { (stu) -> Bool in
        stu.age >= 18
       }
  print(adults) // 数组中只包含stu4 学生

reduce

对于 reduce,我们的使用场景就是对数组中的元素进行组合运算,比如我们想计算所有学生的年龄加载一起是多少。


let totalAges = stus.reduce(0) { (result, stu) in
        return result + stu.age
        }
    print(totalAges) // 62

该函数的第一个参数为初始值,后面元组中的第一个参数为每次计算的结果,第二个参数为每次遍历的元素。最后将计算的结果返回。

组合使用

对于使用高阶函数最大的好处就是可以进行函数式编程了。下面我们通过几个小栗子来对这几个高阶函数进行组合使用。

将 String 类型映射为 Int 类型,并查找id大于1002的所有学生


let adults = stus.compactMap { (stu) in
        Int(stu.id)
        }.filter { (id) -> Bool in
           id > 1002
        }
    print(adults) //[1003, 1004]

计算年龄大于12的所有学生年龄总和


let totalAge = stus.filter { (stu) -> Bool in
            stu.age > 12
    }.reduce(0) { (result, stu) in
   return result + stu.age
   }
   print(totalAge) // 50

总结

到此这篇关于Swift高阶函数的文章就介绍到这了,更多相关Swift高阶函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入浅出的聊聊Swift高阶函数

本文链接: https://www.lsjlt.com/news/134458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入浅出的聊聊Swift高阶函数
    目录初探高阶函数mapcompactMapcompactMapValuesflatMapfilterreduce组合使用总结初探高阶函数 在 Swift 中,高阶函数一共有下面几个...
    99+
    2024-04-02
  • 深入浅出聊一聊js中的'this'关键字
    目录前言什么是'this'关键字四种方式---1.调用函数的第一种方法是:将函数作为一种方法四种方式---2.调用函数的第二种方法是: 简单的调用函数,不将函数作为方...
    99+
    2024-04-02
  • 聊聊Node.js中的导出函数、变量和模块
    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它能够让JavaScript代码在服务器端运行,大大提高了JavaScript在服务器端的应用能力。在Node.js中,我们可以使用exports对象将定义的函数...
    99+
    2023-05-14
  • 深入浅出 PHP 函数的调用顺序
    php 函数调用顺序:解析参数:参数赋值给函数形参。查找变量:确定函数中使用的所有变量。执行代码:逐行执行函数主体。返回值:将返回值传回调用方。 深入浅出 PHP 函数的调用顺序 PH...
    99+
    2024-04-16
    php 函数调用 作用域
  • JS深入浅出Function与构造函数
    目录 1.概述1.1利用Function构造函数创建函数1.2Function与Object2.构造函数2.1自定义否则函数2.2对象的constructor属性2.3构造函数与函数...
    99+
    2024-04-02
  • C++深入浅出讲解函数重载
    目录前言函数重载1.1 函数重载的概念1.2 函数重载的意义1.3 名字修饰(name Mangling)1.4 extern "C"前言 自然语言中,一个词可以...
    99+
    2024-04-02
  • Python3 lambda函数的深入浅
    我们常常看到一个这样的表达式  可能会一头雾水不知道怎么计算 最基本的理解就是 def A(x): return x+1 但是理解程序不会将一个表达式在转为函数的,因为lambda函数设计出来就是 简化def的。 其实很简单 我们可以这...
    99+
    2023-01-31
    函数 lambda
  • 深入浅出讲解Java8函数式编程
    目录什么是函数式编程Java8内置了一些常用的方法接口FunctionalInterface用的比较多的函数接口总结什么是函数式编程 函数式编程就是一种抽象程度很高的编程范式,纯粹的...
    99+
    2024-04-02
  • Swift中的高阶函数功能有什么作用
    这篇“Swift中的高阶函数功能有什么作用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Swift中的高阶函数功能有什么作用...
    99+
    2023-07-05
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2024-04-02
  • 深入了解python高阶函数编写与使用
    目录1.变量可以指向函数2.函数名也可以是变量。3.传入函数总结何为高阶函数,以实际代码为例子一步步深入概念。 1.变量可以指向函数 以abs()为例: >>>...
    99+
    2024-04-02
  • 深入浅析Node中的util.promisify()函数
    Node.js 内置的 util 包有一个 promisify() 函数,可以将基于回调的函数转换为基于 Promise 的函数。本文就来给大家介绍一下Node.js 中的 util.promisify() 函数,希望对大家有所帮助。让你可...
    99+
    2023-05-14
    JavaScript Node.js
  • Lambda 流畅如丝:深入浅出 Java 中的函数式编程
    Lambda 表达式是 Java 8 中引入的,它们是对匿名内部类的语法糖,允许更简洁、更流畅地表达函数。Lambda 流将集合元素转换为另一组元素,对集合操作提供了强大的函数式编程功能。 Lambda 表达式的语法 Lambda 表达式...
    99+
    2024-04-02
  • 深入浅出Node.js事件循环:从入门到精通的进阶之旅
    Node.js 事件循环的工作原理可以分为以下几个阶段: 事件队列阶段:在这个阶段,事件循环会从事件队列中取出一个事件,并将其推入执行栈中。事件队列是一个先进先出的队列,这意味着最早进入队列的事件将最先被执行。 执行栈阶段:在这个阶段,...
    99+
    2024-02-03
    Node.js 事件循环 异步编程 JavaScript
  • 深入浅析Vue3中的生命周期函数
    我们上面提及到一个组合式API中的钩子函数都是可以被多次定义,那意义是什么呢?其实很多时候我们是有这种需求的,我们前面的文章中提及到过 我们的Vue3的组合式API就是具有更高的可维护性,每个逻辑都是单独的代码块,那如果我们在页面初始化完成...
    99+
    2023-05-14
    生命周期函数 vue3
  • 深入了解Go语言函数的进阶技巧
    偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《深入了解Go语言函数的进阶技巧》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看...
    99+
    2024-04-04
  • C++深入浅出探索数据结构的原理
    目录一、前言二、C++的数据结构三、定义结构四、访问结构成员五、结构作为函数参数六、指向结构的指针一、前言 因为C++的数据结构很多,很复杂,一篇文章根本讲不到所有的数据结构。即使写...
    99+
    2024-04-02
  • Java深入浅出数组的定义与使用下篇
    接着上一篇继续,老铁们 1.检查数组的有序性 给定一个整型数组, 判断是否该数组是有序的(升序) public static boolean isUp(int[] arr...
    99+
    2024-04-02
  • Java深入浅出数组的定义与使用上篇
    目录一、数组的基本用法1.什么是数组2.定义数组 3.数组的使用打印数组: 二、数组作为方法的参数基本用法三、数组练习题1.交换两个变量的值2.写一个方法, 将数组中的每个元素都 *...
    99+
    2024-04-02
  • 深入解析PHP中的ECHO输出函数
    深入解析PHP中的ECHO输出函数 在PHP中,ECHO是一个用于输出字符串的函数。它被广泛应用于Web开发中,用于向用户显示内容。本文将深入解析PHP中的ECHO输出函数,包括其用法...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作