Tag: 中级

Swift中的闭包:续集

自从我开始学习Swift闭包以来,我发现自己实际上正在寻找它们,并尝试将它们更频繁地注入我的作品中。 我本着同样的精神涉足函数式编程 不可避免地 高阶函数 。 函数式编程已成为更高级的编程方法之一,它已成为摆在桌面上的一席之地。 但是,这与功能编程无关。 这是关于我对闭包的学习; 它们如何在高阶函数中使用,以及扩展后,它们在函数编程中的作用。 如果您尚未探索函数式编程,建议您这样做。 将您的🐽放到那里,看看是否喜欢它。 你知道他们在说什么,没有有害的知识。 本文主要借鉴了Ray Wanderlich的本教程,主要是因为我发现它很好地解释了并且阅读起来很有趣。 Ray Wanderlich的教程难道不是很棒吗? 🙌 要继续学习本章,您需要基本的闭包知识。 不是你的茶吗? 不用担心,当我的学习也不是我在这里喝茶的时候,我就写下自己的学习内容。 在进行函数编程之前,让我们回到舒适的区域。 这是我们最常使用的东西。 您有一个列表,想要遍历该列表并执行某些操作。 您将做什么,请召唤for循环! 这就是所谓的命令式编程 。 这看起来很整洁,您了解它并且很容易编写。 那么,为什么要解决未损坏的问题呢? 这就是为什么! 释放🐉,我的意思是声明性的! 上面的示例实际上只是一行代码,它很简洁,即使现在看起来不太像,但编写起来却容易得多。 这些只是我们看到的一些优势,我们将在进行过程中探讨其他更大的优势。 我有你的兴趣吗? 现在我们可以尝试定义什么是功能编程。 函数式编程是谁? 函数式编程是专注于数学计算并避免状态和可变数据的范例。 一旦避免了状态数据和可变数据,我们将转向高阶函数来填补空白。 与定义高阶函数一样,这似乎是一个好时机。 高阶函数 高阶函数是接受其他函数作为参数,可以返回一个函数或同时返回两者的函数。 当我们在这里探索闭包时,我们提到闭包被称为高阶函数functions。 上面有一个小问题,我们将使用它来查看几个高阶函数。 这是一个书店模型。 有各种组成部分的书籍和书籍清单。 地图 这是一个闭包 , 接受一个函数作为其参数,并在将函数应用于数组中的每个元素后返回 长度相同 的数组 。 问题1 我们希望在我们的小书店中获得所有书名的列表。 我们该怎么做呢? 势在必行? […]

iOS中的架构模式

在最近的过去,我一直在花一些时间来了解大多数软件开发人员所犯的菜鸟错误。 老实说,我经常被召唤。 但是,我最内gui的一个错误是,在开始项目之前没有计划。 这对我们最好的人来说已经发生了。 从第一天开始,您就可以开始这个令人惊叹的全新闪亮项目。 这个项目的成功,潮起潮落可以这么说。 通常,这种兴奋会击中应该做出合理决策的大脑部分。 因此,您该怎么做,您会立即开始编写代码。 五天后,该项目开始呈螺旋式下降。 您开始想象自己对这个项目的判断有误。 毕竟,这可能不是一个很酷的项目,也许这是一个很好的旧诱饵和转换案例。 但是事实是,您就是问题所在。 这不是项目,从来没有。 该项目保持不变,是您改变了。 💔如果您不计划,那么很可能会迷失其中。 兴奋消散之后,您将得到的只是意大利面条代码。 然后,您很可能会放弃它,或者更糟糕的是,仍然编写可怕的,没有灵感的代码。 现在我们已经大声疾呼了,让我们看一下要计划的最重要的事情之一。 所有冰雹建筑模式! 👯 您问什么架构模式? 它是对常见问题的通用可重用解决方案。 你为什么要关心它? 架构模式使您和您的团队成员的工作更加轻松。 由于关注点分离,因此更容易调试和浏览代码库。 哇! 那是很多单词,没有代码。 现在您仍然在这里,我将为您提供一些代码。 🎉 聊够了,给我看看代码!!! MVC 我们将从这个非常常见但被误解的模式start开始。 MVC已经存在了很长时间。 您知道MVC,这就是隔壁的低维护模式。 如果您已经编写了iOS代码,则可能使用了MVC模式。 这是构建iOS SDK的模式。 这种模式将所有代码分为模型,视图和控制器。 模型; 这是数据所在的位置。 它负责持久性,建模对象和解析。 视图; 这负责与用户进行交互的所有内容,即在屏幕上看到的内容,例如标签和文本字段。 控制器; 这在模型和视图之间进行中介。 MVC示例 如上所示,该模型基本上是对数据进行建模。 在此示例中,它将膳食数据项描述为具有两个属性。 在此示例中,视图和视图控制器紧密耦合。 如果有人要问MVC中的视图和视图控制器之间有什么区别,我会说我不确定。 因此,MVC无法分离关注点 。 由于视图控制器趋于庞大并且几乎无法导航,因此它被命名为Massive View Controller。 […]

Swift中的闭包

在过去的九个月里,我一直在学习Swift。 说我正在爆炸是轻描淡写。 但是,每当我要举行快速聚会时,街上都会有一辆警车在等着将其关闭。 噢,封锁,谁伤害了你? 所以我最终决定学习闭包,并考虑记录我的奋斗 , 学习和最后的阿哈时刻 。 这些大多数都是我从不同来源学到的东西,但发现自己希望自己在一个地方找到。 这些内容包括但不限于Bob the Dev的博客,快速的文档以及有关Medium的惊人文章。 为什么叫名字? 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用。 这被称为关闭它们,因此被称为closures。 您看起来很熟悉,我以前在哪里见过您? 闭包由于其干净且经过优化的语法而处在许多地方。 您可能在什么时候遇到过他们; 使用动画; 这是因为某些功能是异步执行的。 这是使用escaping闭包的绝佳机会。 从第三方API获取数据; 这也是使用escaping闭包的另一个绝佳机会。 在视图控制器之间传递数据 Swift的许多内置函数都需要关闭。 这是一个; 闭包函数 Apple将闭包定义为传递的自包含功能块。 在我们过于技术化之前,我们可以了解如何将函数转换为闭包。 这是一个简单的函数,用于查找必须学习闭包的时间。 它需要两个参数, days和name然后返回一个字符串,告诉我我还剩下多少天。 优雅吧? 😃 将其转换为闭包; 除去花括号 当然,如果您尝试按原样运行上述代码段,则会收到错误消息。 这是介于闭包和函数之间的东西,也许我们可以称其为乐趣。 没有? 好的! 😄 在参数列表和正文之间(即在String和return之间)添加关键字 这仍然有一个错误。 尽管这是一个有很多观点和观点的有争议的声明,但闭包本质上是无头函数。 因此,我们取出头部😈。 在这种情况下,头部很func learnClosures 还是不运行? 用花括号将其包围 most。 这是最冗长形式的所谓闭包表达式。 稍后我们将看到,您可以将其精简为一行。 现在,我们基本上已经声明了一个闭合,但是没有一种调用它的方法。 解? 我们将其分配给变量。 […]

了解Swift 4中的泛型函数和类型

编写可维护的代码应该是每位软件工程师都应该意识到的一个问题,因为从长远来看,它具有回报。 通常,为了尽快完成工作,我们倾向于重复自己。 这通常涉及复制和粘贴我们可能对函数的类似实现,并进行调整以适合我们想要的内容。 复制在某种程度上增加了复杂性并阻塞了可读性。 一个好的方法总是尽可能多地采用DRY(不要重复自己)原则。 在我们的代码中,考虑如何设计API和适应的应用架构非常重要,因为从长远来看,这会影响代码的可维护性。 因此,回到讨论主题。 Swift中的泛型。 使用通用代码,我们可以编写可重用的函数和数据类型,这些函数和数据类型可以与匹配我们定义的约束的任何类型一起使用。 目的是排除共享功能并减少样板代码。 我们有约束和不受约束的泛型。 对于不受约束的泛型,我们不能对它们做太多事情。 受约束的泛型用协议表示。 我们所知道的协议在其符合类型上声明了一组要求。 在这一点上,让我们通过具体示例更深入地探讨实际问题。 解释够了吧? 是的,让我们这样做。 我们将使用Xcode Playground。 因此,随着我们的前进,请随时在操场上测试代码。 我们将从无约束的泛型开始,但是我们不会浪费时间,因为我们不能真正地对无约束的泛型做很多事情。 上面的参数化函数可以接受任何类型的输入。 我们可以将输入值复制到局部变量,然后从函数返回它。 我们也可以将函数传递给另一个函数。 这就是我们可以使用此不受约束的泛型函数所能做的事情。 因此,现在让我们看看受约束的泛型函数。 首先,我们将在不使用泛型的情况下进行常规实现。 然后,我们将使用泛型来排除共享功能并减少样板。 我们的示例将通过decodable协议从网络中获取数据并解码json响应。 我们将从https://jsonplaceholder.typicode.com/获取数据,其中包含用于测试的虚拟数据API。 通过仔细查看上面的函数,我们可以轻松地看到fetchPosts和fetchComments函数有很多共同点。 它们之间的唯一区别在于不同的Post和Comment模型对象,这些对象符合我们传递给JSONDecoder的可解码协议。 因此,这是一个很好的地方,我们可以使用泛型来避免代码重复。 注意:我们正在从上述函数同步获取数据。 在生产代码中,建议异步获取数据,以避免在等待下载完成时冻结UI。 因此,让我们继续提取通用函数,我们可以轻松地重用它们而无需重复自己。 因此,使用泛型,我们已经能够提取两个功能之间的共享功能。 因此,使loadResources可重用。 我们将该函数限制为可解码协议,以帮助我们根据分别来自用户特定函数loadPosts和loadComments通过完成处理程序传递的模型对象类型来解码json数据。 编译器将能够在运行时根据我们传递给完成处理程序的类型来推断参数类型。 在总结泛型之前,还有一件事是看一下泛型类型或数据类型 。 我们将实现一个通用类型,以执行与从网络中获取数据相同的操作,但是这次,我们将使用 结构 。 就像函数一样,结构也可以是泛型的。 通过以上操作,我们设法减少了postResource和commentResource实例,以描述资源所在的位置。 我们已经将网络部分完全分离出来了。 因此,使用这种方法,测试变得更加简单,因为我们可以轻松地测试该结构的实例以了解其是否完整形成。 从以上代码中,我们还有两个功能,一个功能同步执行资源加载,另一个功能异步执行操作。 基本上,除了使用URLSession异步API外,两者之间的区别是在异步函数中使用了注释关键字@escaping 。 这样做是为了确保完成处理程序转义方法的范围,因为我们正在处理异步请求。 因此,最后,我们已经能够解释如何在Swift中实现泛型函数和类型。 我知道现在您对自己今天学到的东西感到高兴。 […]