Tag: 编程

戴夫·托马斯(Save Swift)

本系列文章展示了我对Dave Thomas的代码集的思考过程和Swift解决方案(正在进行中)。 在空手道中,kata是您不断练习以取得成功的一系列编排动作。 还记得丹尼尔森是如何做到的? 游戏时间 好吧,这是数千个小时。 练习时间 这些解决方案针对可读性,可测试性和可维护性进行了优化。 我的编码风格强调变量,类型和方法名称的简洁性。 我希望能够回到6个月前编写的代码,或多或少了解我在做什么。 我希望能够自信地重构一种方法,因为我没有破坏任何东西。 这是GitHub存储库,其中包含所有已完成的练习。 我很想听听您对这些方法的看法,并很高兴在评论中与您讨论。 卡塔斯 Kata04:数据整理-第1部分,第2部分,第3部分 Kata18:传递依存关系

使用结果扩展编写声明性代码

最近,我读了Benedikt Terhechte的精彩文章,他在其中扩展了optionals的API。 在标准银行,我们非常广泛地使用结果类型,因此我采用了相同的想法并将其应用于结果类型。 在这篇文章之后,我们将获得可组合的代码和声明性的API,类似于下面的代码片段。 您可以在以下Playground文件中找到一个工作示例。 TYRONEMICHAEL /结果扩展 result-extensions –使用结果扩展 github.com 编写声明性代码 虚构的摘要 假设我们正在为客户构建一个简单的应用程序。 与域名专家坐在一起后,他通知我们任何人都可以浏览该应用程序,但是要成为注册用户,您需要满足以下要求: 注册用户必须具有有效的 标识符 。 注册用户必须具有有效的电子邮件地址,并且该电子邮件地址必须是Gmail地址。 注册用户必须是千禧一代或X一代 。 我们需要向用户展示为什么尝试后无法注册 。 用应用程序扩展结果类型 要求之一是向用户显示为什么他们不能成为注册用户。 通过使用应用程序,我们可以非常漂亮地实现这一目标。 在编写我们的应用程序之前,我们需要定义一个称为半组的协议。 布兰登·威廉姆斯(Brandon Williams)对半群是什么以及为什么要使用半群有很好的解释。 出于本文的目的,我们只需要一个Array即可符合协议。 现在,我们可以编写扩展结果类型的应用程序。 这允许编写以下代码。 如果在上面打印用户对象的内容,将得到以下内容: 失败:3个要素 -“无效的ID” – “不合规电邮” -“无效的千禧一代” 斯蒂芬·塞利斯(Stephen Celis)的精彩视频详细介绍了上述应用程序和Swift。 一块很棒的手表。 用AND扩展结果类型 要求之一是用户必须具有有效的电子邮件地址和有效的Gmail地址。 让我们使用和的以下代码扩展结果类型。 现在,我们可以执行以下操作。 如果打印结果,将得到以下输出。 失败:1个元素 -“无效的Gmail地址” 用OR扩展结果类型 最后一个要求是用户是千禧一代或X代。我们可以通过使用or扩展结果类型来满足此要求。 现在我们有以下内容。 如果打印结果,将得到以下输出。 失败:2个要素 -“无效的千禧一代” -“无效的gen x” […]

服务器端Swift的启动和运行:第1部分-待办事项列表项目设置

我已经想要了一个基本的,基于浏览器的待办事项列表。 没有任何干扰的东西。 使用Swift构建此库,并了解一些涉及的库似乎是一个不错的起点。 这是一个分为4部分的系列文章,概述了如何设置项目,路由入门,数据库设置以及最终创建应用程序的模型和控制器。 介绍 第1部分将概述一个基本的项目设置,包括使用swift软件包管理器,并让我们开始使用Swift从服务器返回响应中的一些文本。 项目设置 首先,让我们为项目创建一个目录,然后导航到该目录。 mkdir WhatsNext cd WhatsNext 接下来,我们将使用swift软件包管理器创建一个swift可执行软件包。 swift package init –type可执行文件 现在,生成一个xcode项目。 迅捷包generate-xcodeproj 打开项目并切换到第二个目标。 生成并运行,您应该会在控制台中看到“世界,您好!”。 打开WhatsNext.xcodeproj 完美的服务器设置 添加perfect-HTTPServer作为项目的依赖项。 打开Package.swift并将以下内容添加到您的依赖关系中。 .package(网址:“ https://github.com/PerfectlySoft/Perfect-HTTPServer.git”,来自:“ 3.0.0”) 还要将”PerfectHTTPServer”添加为目标的依赖项。 如果您使用的是Swift 3,则上述语法可能会遇到问题。 你可以在这里找到更多。 您最终的Package.swift应该看起来像这样…… 现在,回到终端并更新项目相关性并重新生成xcodeproj。 快速软件包更新 迅捷包generate-xcodeproj 假设没有问题,请将以下导入添加到main.swift的顶部,然后构建并运行。 导入PerfectLib 导入PerfectHTTP 导入PerfectHTTPServer 服务器需要服务 因此,我们的Web服务器需要提供目录或文件。 为了简单起见,我们将在我们的项目中创建一个名为webroot的文件夹,并在其中添加一个文件供我们的项目使用。 mkdir Webroot 触摸webroot / hello.txt 迅捷软件包regenerate-xcodeproj 添加一些占位符文本以了解正在提供文件。 接下来,我们需要在main.swift创建服务器。 我们创建一个服务器,设置其端口和documentRoot,启动它并捕获它将引发的任何异常,例如该端口已被使用。 在运行之前,我们需要将目标的文档根目录设置为项目目录。 为此,选择第二个目标,然后edit sceme […]

迅捷+守卫

让我们承认这一点,我们所有人都想编写“干净的代码”,这对于任何阅读它的程序员都是可以理解的。 很多时候,当我们寻找解决问题的最佳方法时,往往会编写草率的代码,只有我们才能理解 编写干净的代码不仅帮助我们更好地了解代码的结构和目的,而且还帮助将来打算从事该项目的开发人员。 我们可以采用多种方式来组织项目/代码。 其中之一是Swift中的后卫声明。 这种语言的未来具有很多优势,我将在后面的文章中解释。 句法 根据学者的说法,警卫声明的定义是:“一种构造,用于在不满足一个或多个条件的情况下将执行转移到范围之外。”语法很干净,看起来像这样: 现在我们来看看语法,让我们深入了解一下优势, 干净的代码,它确实显示了代码的意图 用例是直接且有目的的 同事和其他开发人员可以了解此代码的功能。 如果您现在已经进入iOS开发一段时间,您还记得在表视图中使用此if语句并实现UITableViewDelegate的情况,如下所述: 如您所见,这是一个实现UITableViewDelegate的可靠示例。 这是一个巨大的代码,但是带有警卫声明,代码更易于理解和安全。 现在花点时间思考一下您曾经使用过的所有这些时间以及是否要检查很多事情。 我可以想到很多例子,例如: 此用户名文本字段是否已填写? 此密码文本字段是否已填写? 布尔是对还是错? 用户是否可以连接互联网? 最后的想法 我真的很喜欢警卫声明。 一开始很难适应它,但是现在我可以找到一千种方法,迅速的功能可以帮助我编写更好的代码-更干净的代码。 希望您喜欢阅读这篇文章。 我很想知道您对后卫声明的想法。 让他们留在回应中,这样我们就可以在那里继续讨论。 我要感谢Tom Fox和Aryan Kashyap为我提供了一些有关本文初稿的建议。

迅捷的Singleton模式

Singletons模式提供了对象的全局可访问共享实例。 在大多数情况下,您在iOS中不需要单例(这可能会被滥用以形成结构不良的代码),但是在某些情况下,仅拥有一个类的实例是有意义的。 。 苹果公司经常使用这种方法。 例如:UIApplication.sharedApplication(),NSUserDefaults.standardUserDefaults(),NSFileManager.defaultManager()均返回Singleton对象。 在Objective-C中 ,为确保仅创建一个单例对象的实例,将其初始化包装在调用dispatch_once函数中,该函数在应用程序的生命周期内一次执行一次块。 在Swift中 ,使用静态类型属性只是必要的,即使同时访问多个线程,该属性也只能被延迟初始化一次: 就是…单线单人! 用法是: Singleton.sharedInstance 由于所有对象都在Swift中带有默认的公共初始化程序,因此我们需要覆盖init并将其设为private 。 这样可以确保单例确实是唯一的,并防止外部对象创建自己的此类实例。 Singleton Shoudl也是最终版本,以防止将其子类化(如果Singleton需要其他功能,则应将其封装在扩展中)。 因此,我们需要添加另一行: 这是Singleton的最终正确实现。 感谢Michael Ormonde提出的“私有初始化”建议。 希望本文对您有所帮助。 谢谢阅读!

RubyMotion iOS开发入门

什么是RubyMotion? RubyMotion是一个工具链,可让您使用类似于Ruby的语法编写iOS,Android,OSX,Apple Watch和AppleTV的真正本机应用程序。 它不是编译器(将您的代码转换为Objective-C)。 应用程序的静态编译方式与Objective-C或Swift编译为本地代码的方式相同。 RubyMotion本质上是Ruby的新实现,旨在用于构建移动应用程序。 为什么要使用RubyMotion? 使用RubyMotion的主要好处之一是,您无需学习新语言即可开始构建移动应用程序。 您将使用已经熟悉的Ruby语言。 如果您还不熟悉Ruby,那么您会发现Ruby比Objective-C,Swift或Java更容易读写。 实际上,您将最终了解一些有关Objective-C的知识,以便翻译一些示例或文档。 第二个好处是能够构建跨平台应用程序。 通过消除语言差异,RubyMotion可以允许您在同一代码库中编写同时支持iOS和Android的单个应用程序。 实际上,在单个代码库中构建跨平台应用程序依赖于使用某种框架来抽象特定于平台的用户界面之间的差异。 幸运的是,已经有一些伟大的框架在这​​一领域取得了进展。 无论如何,由于通用语言,仍然有机会重用代码。 安装RubyMotion 应当注意,RubyMotion仅在Mac上运行。 这是因为RubyMotion仍需要访问Apple库和构建工具才能编译您的应用程序并运行iOS模拟器。 您还需要确保已安装Xcode。 安装Xcode后,打开Xcode>首选项,单击“下载”选项卡,然后安装iOS SDK 9.2。 要开始使用RubyMotion,您首先需要注册许可证并下载安装程序。 访问RubyMotion下载页面,然后选择以下计划: 免费 (“入门”)—非常适合尝试RubyMotion。 您甚至可以将应用程序发布到App Store,但是您的启动图像将显示一条消息,说明它是“由RubyMotion制成”。 另请注意,免费计划仅支持iOS和Android的最新版本。 独立 ($ 199 /年)—如果您打算进行任何类型的专业开发,您可能会想要这个。 支持仅限于社区论坛(以及我们的社区Slack频道)。 专业 ($ 499 /年)—如果您需要优先支持,这是您的计划。 注册计划后,您将收到一封电子邮件,其中包含许可证密钥和下载安装程序的链接。 生成您的第一个应用 现在您已经安装了RubyMotion,让我们生成您的第一个应用程序。 打开您的终端机应用程序。 请注意,本教程是使用RubyMotion 4.8编写的。 如果您没有看到模拟器弹出窗口,那么该是找出问题原因的时候了。 我可能忘了解释一步。 您可以在以下几个地方寻求帮助: 在RubyMotion社区论坛中搜索答案。 在我们的RubyMotion Slack频道中寻求帮助。 在下面的评论中发布您的问题。 假设您已经做到了这一点,那么您已经解决了开发RubyMotion应用程序所需的所有系统配置和依赖项。 接下来,让我们快速看一下app_delegate.rb文件。 这是您的iOS应用程序的入口。 […]

使用Swift在BST中进行级别订单遍历

开始之前,让我们先回顾一下… 在Swift中使用数据结构 因此,基本上我们已经学习了数据结构并在C / C ++中实现。 在这个故事中,您将看到学习一些基本数据的方法。 Swift中的二叉搜索树 从以前的帖子开始:https: //medium.com/@abhishekthaplithapliyal/playing-with-data-structure-in-swift-ccd8efca9611 medium.com 从最近的两个故事中,我们可以获得一些信息。 关于堆栈和树木。 让我们将它们放到一个新的水平,并结束本系列的其他内容。 此处节点1的级别为1,节点2和3的级别为2,节点4,5,6和7的级别为3。 现在,在进行级别顺序遍历的情况下,从根节点开始,从左到右逐一遍历每个级别。 如下所示 所以最终的内联输出就像 20、9、49、5、12、23、52、15、50 就像我们从左到右逐行编写。 那么,遍历为何排队的背后的策略是什么? 在这种情况下,队列是遍历的最简单方法。 与在队列中一样,操作以FIFO方式进行,即首先进行优先操作,并且在进行层顺序遍历时,我们需要首先访问根节点及其子节点,依此类推。 队列 让我们简要介绍一下队列。 队列具有类似数组的结构,其中元素是从后面添加的,因此操作称为Enqueue ,元素是从前面删除的,称为Dequeue 。 这就像售票柜台中的一条线,在该行的最后一行添加了新人,而票证则被卖给该行的第一人。 太好了! BST就在我这边。 希望你喜欢。 直到那时 快乐—编码😄😄!!!

Swift编程第8部分开始-类型转换,安全解压缩可选项和访问控制

在上一篇文章中,我们讨论了初始化,反初始化,覆盖和引用计数。 开始进行Swift编程第7部分-初始化和反初始化,覆盖和… 在上一篇文章中,我们讨论了结构,类,属性和方法。 medium.com 在这一部分中,我们将介绍一些在您自己的代码中经常使用的非常出色的工具。 让我们开始吧。 我不仅随机选择了一条毛毛虫的照片,因为它看起来不错,好吧,也许是的。 它实际上使我想起了打字 。 并不是说变量会像蝴蝶一样进入外壳,而是因为只要有意义,就可以将变量转换为另一种类型。 用外行的术语来说,类型转换是将变量从一种类型转换为另一种类型的过程。 您几乎可以将任何内容转换为String类型,当您打印出该值时,它并不总是很有意义,但是有可能。 让我们看看您是如何做到的,然后我再回头解释什么不起作用。 好的,这是我不断告诉您的那些有趣的部分之一。 如果您喜欢玩运动或与朋友喝酒,它可能不如棒球那么有趣。 但是,在编程方面,我们希望我们的代码安全! 我的意思是,我们不想使用nil值。 我们要确保在需要手工创建的每个值的步骤中,没有一个值,或者我们适当地处理了它。 现在有点免责声明,关于编程语言,我可能不知道在编程世界中会有一场辩论。 老实说,这对我很有效,很容易理解,而且我相信人们有权决定哪种方法是正确的方法。 如果这导致评论中的讨论,那就这样吧。 我们有几种方法可以解开可选选项,其中第一种在Swift代码中更常见。 if let if var guard let 让我们从最常见到最不常见。 if let语句用于将值赋给常量,以便在if语句内部使用。 因此,让我们谈谈代码的可见性以及它与代码世界其他部分的关系。 每当您创建一个新项目时,您都在创建一个模块。 当您采用其他人的代码作为框架(可用于扩展自己的应用程序功能的模块)时,您将在代码中添加另一个模块。 默认情况下,您的代码不能被其模块使用,您必须在保护壳上戳孔以允许另一个模块访问您的代码。 从最低限制到最高限制封装代码的顺序如下: 大家 模组 文件 我可以解释,不要对所有经验丰富的开发人员大喊大叫。 您可以为类,结构和枚举提供五种不同类型的访问权限。 现在让我们仔细研究一下,然后按最有意义的顺序详细讨论它们。 开放存取 公共访问 内部访问-未指定时的默认访问级别 档案专用 私人的

可视化初学者的循环输入(Swift 3)

熟悉循环对于使用任何语言进行编程都是必不可少的,而且当您刚入门时,事情可能会变得有些混乱。 在本文中,我将提供一些基本示例,这些示例应有助于您直观地了解运行时for-in循环在做什么。 这应该使您更好地了解代码的执行方式以及使用循环的时间。 基本 在第一个示例中,让我们看一个标准的for-in循环。 在此循环中, 索引从1的值开始,并且每次我们迭代for循环直到索引达到5时, 索引都会增加1。 for循环中唯一的语句是print(index) ,它在控制台的新行上打印index的值。 这样我们得到以下控制台输出。 与其将这些数字打印到控制台,不如将它们添加到阵列中。 在这里,我们从一个名为myArray的空数组开始,然后使用append(index)方法将index的值添加到myArray中 。 每次我们迭代for循环时都会调用append()方法……因此我们将索引值相加5次。 若要查看实际效果,请在for循环内添加print(myArray) 。 我们可以通过for循环的每次迭代来观察myArray的状态! 对于通过for循环的每次迭代, 索引值 被附加到myArray的末尾,然后打印到控制台。 嵌套循环 当您在一个循环中放置一个循环时,这称为嵌套循环。 在编码时,它并不总是最有效的解决方案,但在浏览或创建新集合时可能很有用。 当您运行具有嵌套循环的程序时,很难准确地分辨出每个循环在做什么以及何时执行。 希望这些示例将帮助您可视化for循环如何构建或移动数据。 看一下下面的字符串数组 。 blueEmojis包含5个(精心选择的)蓝色emoji表情, redEmojis包含3个(完全随机)红色emoji表情。 让我们使用一个for循环从我们丰富多彩的集合中制作字符串。 在这里,我们声明了一个变量,它将保存我们的表情符号字符串。 在它的下面,我们有了第一个for循环,以循环访问blueEmojis Array 。 emojiString以空白字符串开头。 使用for循环,我们可以在其中附加表情符号! 接下来让我们分解一下for循环〜 blueEmoji (否)表示blueEmojis 数组中的单个值。 blueEmoji以blueEmojis中第一项的值开头 ,并使用.append(blueEmoji)将其附加到emojiString中。 它遍历数组,直到所有值都被迭代为止。 让我们看看如果在循环中添加print()函数会是什么样子。 如您所见, blueEmojis数组中的每个表情符号都已添加到emojiString中并打印到控制台 每次我们迭代for循环时。 现在让它嵌套在redEmojis 数组的另一个for循环中, 并带有自己的append()和print() ,看看会发生什么! 如果我们查看控制台,可以看到在添加第二个blueEmoji之前,所有三个redEmojis都已添加到字符串。 这意味着在blueEmoji for循环可以完成一次迭代之前, […]

在Swift中使用字符集

它们并不是特别常见,并且您不会像在数组,字典或循环中那样频繁地在代码中遍历它们。 但是,当您确实需要它们时,它们可能会非常有用。 我在说什么 字符集! 第一次我真的需要使用一个字符集时,初始化和实现一个字符集无疑使我感到困惑,因此,我当然想进一步探讨这个主题。 什么是字符集? Apple告诉我们,字符集是一种类型的集-一种无序的唯一元素集合-包含符合Unicode的字符。 由于它们是无序的并且不包含重复项,因此字符集通常用于搜索操作,而不是用于存储和访问信息。 创建自己的字符集很容易。 下面,字符集元音被初始化为包含字母a,e,i,o和u 。 将字符集付诸实践 现在,我们可以使用此字符集在字符串中进行搜索。 假设我有两个常量字符串, fullWord和shortWord: 这些字符串是否包含元音中的任何字符? 我们如何检查? 我发现做到这一点的一种方法是使用rangeOfCharacter(from:)函数,该函数将字符集作为参数。 (由于使用该功能不能使字符集无效,因此还需要将其拆开。) 虽然这很笨拙,但肯定有一些更优雅的方法可以找到答案。 嗯 有什么我想念的吗? 字符集还有什么用呢? 字符集类型属性 字符集的一个非常有用的方面是它们的类型属性。 基本上,这些都是基于Unicode类别的预包装字符组,可供您使用! 这些类型属性的一些示例是: 您可以在Apple的API参考中找到完整的字符集列表。 让我们在下面更详细地研究其中的一些。 标点属性 如果您对字符集可能包含的内容有所了解,但又不了解每个字符的详尽列表,那么字符集类型属性将是极好的选择。 例如,想到标点符号。 如果您想删除字符串中的所有标点符号,而只剩下字母,该怎么办? 您将搜索并排除哪些标点符号? 我想取出句号 , 逗号 , 感叹号 , 问号 , 冒号 , 分号 , 连字符 , 破折号 , 撇号 , 引号 , 正斜杠 […]