Tag: 高阶函数

Swift中的变形金刚

变形金刚? 直到最近,每当我听到“功能是Swift中的头等公民!” ,我希望将闭包作为方法中的回调或完成块传递,也许是要从异步网络调用中获取一些数据,如下所示: func fetchUsers(_补全:@转义([用户])->无效){ // .. } 或将代码块分配给变量: 让闭包= { 令a = 1 + 2 + 3 打印(a) } 真好 我们也知道Swift的map和其他高阶函数将闭包作为参数。 多进行一些挖掘,这将打开一个门户,进入另一个维度,即编写代码的功能方式。 等等,暂时不要下载RxSwift,我们可以从这里开始一些基础知识。 我对函子/单子的可疑理论 原来, map , flatMap , reduce之类的东西代表了Swift的功能风格。 Haskell是一种纯函数式语言,在Haskell的fmap和liftM之间直接映射到Swift的map和flatMap 。 这些实体称为函子或单子 。 这些来自类别理论。 如果我被迫开枪简要介绍我对该概念的非常有限的理解,我会说, 我们对基本类型执行操作的方式,函子/单子使我们即使在上下文中也可以对此类进行操作。 例如: func addTwo(int:Int)-> Int { 返回int + 2 } 让三个= addTwo(int:1)// 3 让threeOrMore = [1,2,3] .map(addTwo)// [3,4,5] […]

高阶功能适用于优雅的高级编码器

(((((()-> {})-> {})-> {})-> {})-> {} 好。 这篇文章有点愚蠢,因为我将使用另一个高阶函数编写一个高阶函数,以便向您展示什么是高阶函数。 我希望我不会犯任何错误。 高阶函数是将函数作为其参数的函数。 好吧,我认为该陈述并不能解释“全部”,但这是我可以向任何非编码者朋友解释的最简单的方法,所以请问。 无论如何,许多编程语言中都存在高阶函数。 我将在本文中使用Swift,但是所有其他语言的概念应该相同。 让我们深入研究。假设我们有一个整数数组。 让数组= [1,2,3,4] 这是将所有元素乘以2的Computer-science-101方法,这是 var newArray = [Int]() 对于0中的i .. <array.count { 让element = array [i] * 2 newArray.append(element) } print(newArray)// [2,4,6,8] 实际上,这里的for循环可以被forEach函数代替,后者是Swift附带的高阶函数。 甜… var newArray = [Int]() array.forEach({ newArray.append($ 0 * 2) }) print(newArray)// [2,4,6,8] 请注意,我们没有将0乘以2。 $ $ 0只是保留的简短形式,表示闭包的第一个参数。 不要问我为什么是$ 0。 […]

高阶函数(Swift):

高阶函数是迅速进行功能编程的概念。 听起来很复杂,但相反却很简单。 定义:可以接受函数或闭包作为参数或返回一个函数/闭包的函数称为高阶函数。 有许多高阶函数,我们将研究其中最广泛使用的一些函数:map,flatMap,filter,reduce和sorted。 返回一个数组,其中包含将给定闭包映射到序列的元素上的结果。 进口基金会 让数组= [1,2,3,4,5] // map使用一个参数关闭,并将更改逐一应用于数组的每个元素。 让mapArray = = array.map({num in 数* 100 }) 打印(mappedArray) //使用尾随闭包来简化地图 让mapArray = array.map {$ 0 + 5} 打印(mapArray) 宣言: func flatMap (_转换:(Self.Element)抛出-> SegmentOfResult)重新抛出-> [SegmentOfResult.Element] whereSegmentOfResult:Sequence FlatMap非常喜欢Map,但是顾名思义,它可以使结果变平,因此,如果您有array(嵌套数组)的数组,并且使用了flatmap,那么它将提供合并了嵌套数组所有元素的级联数组。 进口基金会 让数组= [[“ Dhoni”,“ Ganguly”],[“ Kohli”,“ Rahul”],[“ Yuvraj”,“ Rohit”,“ Bhumrah”]] 让flatmap1 = array.flatMap {$ 0} 打印(flatmap1) 让arr = [“ […]

Swift的上帝之类的功能:map,filter,reduce,flatmap。

还记得面试官要求您将代码优化为一行的时候吗? 我总是对我有这种感觉。 但是Apple的新语言(已经3年了,但仍然很新)Swift通过引入诸如map,reduce,filter,flatmap higher的高阶函数而获得了支持。 让我一一介绍。 地图 Map用于迭代一个集合,并返回一个数组,其中包含将给定闭包映射到序列元素上的结果。 使用地图,我们可以轻松更改任何元素的值。 假设我们想将美元转换为印度货币,并且有以下数组, 令USD = [10,20,30,40,50] 我真的不想向您展示我们已经遵循多年的常规惯例,您也不是为此而来,不是吗? 让我们开始潜水吧 要将USD转换为INR(印度卢比),我们可以编写一个神奇的代码,例如 令INR:[Float] = USD.map {Float($ 0)* 65.32} // [653.200012,1306.40002,1959.59998,2612.80005,3266.0] 瞧! 😇 输出将是Float数组,其中包含所有转换为INR(最大成就)的值。 有趣吗? 过滤 另一个可口的方法用于遍历集合并返回仅包含那些与条件匹配的元素的数组。 让我们考虑一下,我们只需要数组中的偶数, 让arrayOfNumbers = [1、2、3、4、5、6、7、8、9] 我们可以通过写得到偶数, let evenNumbers = arrayOfNumbers.filter {$ 0%2 == 0} // [2,4,6,8] 降低 Thanos手套的另一块无限石。😍 这将返回一个值,该值是通过合并集合中的所有值得到的。 让我们考虑另一个通用数组, 让itemPrice = [10、20、30、40、50] 减少功能将是 设total = itemPrice.reduce(0,+) […]

HOF钻孔,高阶功能

HOF钻孔,高阶功能 哦是的!!! 您完全看到了。 钻孔:不是“打个洞”,而是军事版本的训练。 在这里… mobidevtalk.com 哦是的!!! 您完全看到了。 钻孔:不是“打个洞”,而是军事训练。 在这两个博客文章系列中,我们将深入探讨Higher order Function aka HOF 。 所以收紧靴子,会很泥泞。 如果您是可以使用HOF的人或女孩; 嗯,我猜😉。 但是您对幕后发生的事情很感兴趣,然后您就处于适当的位置。 我们将HOF演练分为两部分。 内容: 第一部分,意味着此博客文章,将详细介绍HOF。 在第二部分,我们将生成一个复杂的案例研究,我们将使用HOF进行解决。 这样一来,我们最终可以掌握HOF。 背景: 真正的HOF是什么! 为什么要使用 预先知识 Swift的一些HOF 你好,我是HOF 尽管HOF这个名称似乎很难理解,但实际上并非如此。 HOF唯一困难的事情是对何时使用哪种HOF的理解。 HOF是一个非常简单的概念。 HOF , Higher Order Function ,基本上是具有以下两个属性的函数: 带/不带其他参数的闭包作为参数 返回一个函数或一些累计值 简而言之, HOF将有助于重复 操作 。 现在,这两个关键字repetitive和operation意味着什么? 关键字repetitive ; 你已经猜对了吧? 是的,它仅对集合类型有效,例如Array Dictionary Set 。 集合的每个元素都将包括在内。 其次, […]

新Swift开发人员的最佳做法

即使您是新的Swift开发人员,或者您最近刚从Objective-C换下来,也很高兴知道您可以使用Swift做些什么。 我将在这里向您展示在Swift中使用for循环而不是强大的高阶函数(map,compactMap,filter,reduce)时常见的错误或不当实践。 我创建了一个简单的小型应用程序。 它称为家庭应用程序,其中有一个TableView填充了一位母亲和她的孩子的名字。 即使这是一个小型且简单的应用程序,我仍将使用一个不错的架构MVVM。 我知道我只能用MVC做到这一点,但是本教程是关于快速最佳实践的,所以我也想将其应用于体系结构🙂 首先让我们看看我们的模型 一位母亲有一个名字,她的孩子和一天的心情。 她可以快乐,悲伤或生气。 Model-View-ViewModel设计模式的起源可追溯到Microsoft,并将对象分为三个不同的组: 型号 :应用数据。 它们通常是结构或简单类。 视图 :这部分基本上是针对UI的。 View-Model :是视图的规范表示。 提供一组接口,每个接口代表视图中的UI组件。 为了连接UI组件和ViewModel接口,我们使用一种称为“绑定”的东西。 MVVM与绑定效果更好。 这种方法的好处是,与MVC模式相比,代码变得更加模块化,更易于维护和测试。 那么,视图模型应该是什么? 表示逻辑和 例如将值从模型转换为视图可以显示的内容,例如,将日期转换为字符串,或将小数转换为货币字符串。 还进行错误处理,并且在哪里进行API调用有不同的意见。 我总是在视图模型中执行此操作,但API代码位于不同的层中。

Swift 4.2 Reduce和CoreLocation:总行驶距离🚗

在最近的一个项目中,我遇到了一个非常确定的问题,我敢肯定其他许多开发人员也会遇到:计算列表中存储的位置之间的总距离。 例如,假设您在由CLLocation对象列表表示的地图上有一条自定义路线。 您如何仅从CLLocation对象计算路线的总长度? 其背后的数学很简单,绝对没有理由写一个故事: 总距离等于列表中所有连接的位置对之间的距离之和 。 对于位置[A,B,C,D]的列表,可以表示为: | AD | = | AB | + | BC | + | CD |。 但是,可以使用我们位置对象上提供的函数distance(from :)以不同的方式完成该实现。 样板解决方案: 使用传统的面向对象方法,可以通过几个变量和位置迭代来解决此问题: 样板解决方案 该实现完全按照我们的预期工作,并且对于任何初看它的开发人员来说都是可读性和可理解性。 但是(没有双行中断),对于需要参考下一个/上一个元素以及将在集合迭代期间进行调整的变量的任何给定问题,最有可能重写这9行代码因此命名为样板解决方案)。 递归解决方案: 递归专家将很快意识到这是一个递归问题:我们为递归列表的一部分积累一个临时结果,并使用积累的结果对列表的其余部分执行相同的操作。 这就是为什么递归函数可以帮助我们节省几行样板代码的原因: 递归解决方案 但是仅通过查看递归函数就可以肯定地说,我们获得的一行代码(与样板解决方案相比)不值得在递归调用中引入一致性和简单性的损失-请记住,并非所有开发人员对递归同样感到高兴。 简化的解决方案: 如果我告诉过您所有的样板代码和递归代码都可以限制为一行代码怎么办? 一个纯粹的面向对象的开发人员可能不会相信我,但是实际上,这是可以实现的。 如果考虑我们在做什么,我们将在递归数据结构上应用组合函数(distance(from :)),并以递归方式使用函数的每次应用结果。 这正是函数编程中高阶函数折叠所做的定义¹。 幸运的是,在Swift中,我们有一个类似的功能可以折叠: reduce(_:_:)函数reduce(_:_:) 。 reduce函数将初始结果和闭包作为参数,然后在返回最终结果之前使用闭包组合Sequence的每个元素。 最简单的示例是使用reduce函数对整数列表求和: [2,5,3,10] .reduce(0,+)//返回20 但是,在我们的情况下,我们需要更加具体,因为+函数实际上不适用于CLLocation对象。 相反,我们希望应用distance(from:)函数。 为此,我们还需要引用列表中的上一个(或下一个)元素。 reduce函数不会自动为您提供下一个元素的访问权限(与其他任何迭代一样),因此,为了解决此问题,我们可以使用元组作为初始累加结果,第一个元素是累加距离,第二个元素是累加距离先前的CLLocation对象: (CLLocationDistance, CLLocation?) 。 location元素是可选的,因为在我们提供给reduce函数的初始结果中没有先前的元素。 […]

Swift 4 ~~高阶函数-过滤,映射,归约和排序

您可能已经听说过Swift中的高阶函数 。 简单来说,高阶函数是开发人员友好的代码段,可在几行内完成复杂的计算。 很快我们有了Filter() , Map() , Reduce()和Sorted() HOF。 所有这些都有其自身的优点,并且在我们的代码中易于使用。 让我通过Swift4中的一些有趣的示例向您展示如何使用它们。 1.过滤器(_ 🙂 Filter方法将检查条件,如果条件满足,它将返回一个对象。 您可以将filter(_ 🙂与String,Array,Dictionary,Set等一起使用。 让我们在Set上看看如何使用它。 我有一组名称,我需要选择只有5个字符的名称。 那我该怎么办呢? //名称集 let nameSet:Set = [“ trivan”,“ mary”,“ larns”,“ tria”] //结果集 var resultSet:Set = [] //遍历nameSet中的每个元素 nameSet.forEach {(元素)在 如果element.count == 5 { resultSet.insert(element) } } print(resultSet) 如何使用HOF 过滤器(_ 🙂完成此操作? 让我用过滤器(_ 🙂向您展示上述要求的代码 let nameSet:Set = [“ trivan”,“ mary”,“ […]