Tag: swift

Swift —地图和flatMap

关于map&flatMap把网路上的一些资源做重点整理 参考: 斯威夫特烧脑体操:http://www.infoq.com/cn/articles/swift-brain-gym-map-and-flatmap 应用范例:http://blog.xebia.com/the-power-of-map-and-flatmap-of-swift-optionals/ Monad&Functor图解:http://www.ruanyifeng.com/blog/2015/07/monad.html Array有一种map函数,两个flatMap函数: 当map的闭包返回值,不是序列类型时,和flatMap的差异就只是在于是否判断结果为nil。 可选有一种地图函数,一种平面地图函数: 两者本质上一样,提供调用者闭包函数,可返回Optionalvalue,也可以是非Optionalvalue。 Array和Optional的map函数都叫一样的名字,是因为他们都是Functor 。 Array和Optional的flatMap函数都叫一样的名字,是因为他们都是Monad 。

自定义字体。 附录2. iOS Travel Guide应用程序

步骤2:将字体包括到项目Info.plist中 转到Info.plist文件,并添加一个新键“ 应用程序提供的字体” 。 将字体的{ 文件名}添加到列表中。 步骤3:初始化UIFont实例 UIFont(名称:“ OpenSans”,大小:12)

开闭原则:正确扩展实体

在SOLID首字母缩略词“封闭式原理”中包含的所有设计原理中,可能是最难理解且最经常破解的。 毕竟,如果您想向实体中添加功能,为什么不直接将其添加到实体的现有实现中呢? 作为新手程序员,我肯定会感到这种感觉。 本文的目的是首先讨论“开放式封闭原则”背后的原理,然后研究三种正确扩展实体的技术。 什么是开放式封闭原则,为何如此重要? 让我们从Bertrand Meyer最初编写的定义开始: 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改 本质上,我们是在谈论以某种扩展方式向实体添加任何新属性或方法,而不是将它们直接放入实体中(然后进行修改)。 那是有道理的,但是为什么我们要在这个麻烦上走? 这是一些原因… 遏制错误的引入 假设我正在编写一个供第三方使用的软件包,并决定要向现有实体添加一些新功能。 从表面上看,这似乎很好。 但是,当我进行这些更改时,我并未考虑系统中其他实体与我刚刚修改的实体进行交互的所有不同方式。 我的修改会产生意想不到的影响,导致系统其他部分出现错误吗? 通常,我们希望逐步开发我们现有的代码,以使其尽可能高效且无错误。 在此过程中引入新的属性或方法可能会取消数月甚至数年的迭代改进。 单独关注 当我向现有实体介绍新功能时,很可能会打破SOLID原则中的不止一项。 如果新功能使我的实体超出其原始用途的范围,我还将打破“单一责任原则”。 为了代码可维护性,我应该保留原始实现,并使用其他方法对其进行扩展。 设计更好的实体 在采用开放式封闭原则的所有原因中,最重要的是它鼓励我们通过使用泛型和面向协议的编程(POP)原则来创建具有良好抽象平衡的实体。 试想一下,如果我知道我不能回到自己的实体来更改类型,那么我将非常谨慎地以能够提供最大灵活性的方式进行设计。 结果是我们最终可以编写更少的代码,并使我们编写的代码适用于更多情况。 简而言之,我们编码更好。 显然,这里可能会有更多的讨论,但是为了继续学习一些有用的技术,让我们考虑最后一个大问题…… 我应该严格遵循开放式原则吗? 遵守开放式封闭原则是一个主观选择,开发人员通常在何时扩展实体上有不同的看法。 毕竟,您的实体可能被认为是“完成”或“进行中的工作”,最终您作为开发者是做出这种区分的仲裁者。 以我的经验,如果您决定实体需要您想要实现的功能来履行其单一职责,那么请继续添加它们(无罪感!)。 否则,这里有一些有关如何正确扩展它们的想法。 扩展技术 在下一部分中,我们将介绍三种扩展技术并对其进行批判。 事不宜迟,让我们熟悉在以下示例中将要使用的惊人实体: 是的,这真是好人。 技术#1:协议扩展(OK) 假设我希望我的“ Thingy”能够摆动(不要问我为什么……)。 我的第一个直觉可能是这样做: 显然,这违反了我们的开放式封闭原则。 因此,一种方法可能是创建一个声明该方法的协议,然后将其实现放入我们的struct的扩展中: 很好。 请注意,方法的声明发生在协议中(第9行),其实现发生在实体的扩展中(第15行)。 我们可能考虑的一种变体是将方法的实现放入协议扩展中。 这将使我们能够在符合协议的任何实体上使用相同的方法实现。 看起来像这样: 这里要注意的最大区别是,我们的摆动方法的声明和实现现在都在协议的扩展中(第9-15行)。 当实体符合协议时(第17行),现在无需实现该方法。 因此,通过第一组示例,我们从技术上扩展了我们的实体,而没有对其进行修改,但是请注意! 首先,这种技术仅适用于方法,不适用于属性,因为我们无法在扩展中存储任何内容。 其次,也许还有一个更大(但不太明显)的缺点是,我们不再能够像添加摆动方法之前那样使用“ Thingy”的原始实现。 技术#2:类继承(OK) […]

Swift 3中的API.AI

目的 我希望到本文结束时,您将像老板一样,学习如何在自己的Swift 3项目中实现API.AI。 这篇文章是我一段时间以来收集到的信息的汇总,并认为这对分享很有帮助。 一个帖子,面向有意构建自己的机器人或在互联网上发现不足/过时信息的人们。 如果您阅读了我以前的博客文章,您会知道我对API.AI缺乏相关支持的感觉。 过时的资源和大量的挖掘工作。 这是您可以遵循的直线指南。 先决条件 在继续之前,强烈建议您对API.AI有足够的了解。 如果这是您第一次了解API.AI,请查看API.AI简介。 除此之外,让我们开始吧。 项目构想 在写完上面的标题后,我决定花15分钟的时间提出一个简单而有意义的AI项目构想。 我已经决定我们要构建一个交通信号灯机器人应用程序。 我想要一个简单且适用的项目。 我们将拥有一个了解我们的机器人。 根据我们的输入更改屏幕上的颜色。 我们还将有一个与我们对话的机器人。 设置API.AI 再说一次,如果您还没有签出API.AI指南,我强烈建议您在继续之前进行操作。 这里。 让我们从打开API.AI开始。 然后登录,我们应该在主控制台上。 现在创建一个名为“ Traffic-Master”的代理。创建一个名为“ change.color”的意图。 用红色,黄色和绿色条目创建一个“颜色”实体。 还添加同义词,如停止,减速和前进。 我们可能想用动词来指代这些颜色,例如“向我展示停止色”。 现在转到我们刚才创建的“ change.color”意图。 输入您的意图的用户表达式。 例: 太酷了,现在让我们向下滚动到“响应”部分。 在文本响应下添加以下两行: am! 我是彩色的! 玫瑰是红色的。 紫罗兰是蓝色的。 我只是将颜色更改为只适合您的颜色。 我们刚刚教我们的机器人如何以文本形式响应更改颜色的意图。 我们给了它两种响应方式,所以我们的机器人不是那么平淡。 机器人的行为将与人类更相似。 您向漫游器添加的变化越多,漫游器对您的响应方式就越多 。 它太酷了。 在API.AI上测试 现在,我们将测试我们的机器人。 向右看,您应该看到一个要测试的空间。 按下麦克风按钮,然后说“给我看红色”。或者直接输入。 然后尝试“该走了。”记住,我们将go设置为绿色等。还要注意我们的机器人的两个不同响应。 太好了,我们的流量管理员了解我们! 现在将“ change.color”作为我们的操作,然后按保存。 […]

iOS教程:制作自己的计时器应用

在您的Xcode上,转到“ 文件” >“ 新建” >“ 项目”以创建一个新的空白项目。 继续,给您的项目起任何名字。 为了我,我放了Timer 。 您可以继续输入所需的信息作为您自己的信息。 现在,您应该知道如何从对象库中获取对象。 如果不是,则位于右下角。 为此,我们将需要3个按钮和1个标签。 继续并相应地放置它们并命名。 在右上角,单击助手编辑器以获取分屏。 基本上,您现在所看到的是右侧的类包含运行左侧布局的代码。 现在,单击每个按钮上的“控制”并将其拖动到代码侧 然后,它将弹出您可以选择的位置,将“ Outlet”替换为“ Action”。 确保开始,暂停和重置具有@IBAction 你应该有: @IBAction for StartButton,我将其命名为startPressed @IBAction for PauseButton,我将其命名为pausePressed @IBAction对于ResetButton,我将其命名为resetPressed @IBOutlet for StartButton,我将其命名为startButton @IBOutlet for PauseButton,我将其命名为pauseButton 标签的@IBOutlet,我将其命名为timeLabel 如果遇到问题,您的代码应如下所示: 导入UIKit 类ViewController:UIViewController { @IBOutlet弱var startButton:UIButton! @IBOutlet弱var pauseButton:UIButton! @IBOutlet弱var timeLabel:UILabel! 变数计数器= 0.0 var time = Timer() var isCounting = […]

在Swift中编写网络层:面向协议的方法

在本指南中,我们将研究如何在没有任何第三方库的情况下在纯Swift中实现网络层。 让我们直接跳到它! 阅读指南后,我们的代码应为: 面向协议 易于使用 易于实施 输入安全 使用枚举来配置端点。 以下是我们最终将通过网络层实现的示例: 只需输入router.request(。 借助枚举的力量,我们可以看到所有可用的端点以及该请求所需的参数。 首先,一些结构 当创建任何东西时,拥有结构总是很重要的,因此以后找东西很容易。 我坚信文件夹结构是软件体系结构的关键因素。 为了使文件井井有条,让我们事先创建所有组,然后记下每个文件的存放位置。 这是项目结构的概述。 ( 请注意,名称仅是建议,您可以根据自己的喜好命名课程和组。 ) EndPointType协议 我们需要的第一件事是定义我们的EndPointType协议。 该协议将包含配置端点的所有信息。 什么是端点? 好吧,从本质上讲,它是一个URLRequest及其所有组成部分,例如标头,查询参数和主体参数。 EndPointType协议是我们网络层实现的基石。 继续,创建一个文件并将其命名为EndPointType 。 将此文件放在“ 服务”组中。 (不是EndPoint组,我们将继续进行说明)。 HTTP协议 我们的EndPointType具有构建整个端点所需的许多HTTP协议。 让我们探究这些协议的含义。 HTTP方法 创建一个名为HTTPMethod的文件,然后 将其放在“ 服务”组中。 该枚举将用于设置请求的HTTP方法。 HTTP任务 创建一个名为HTTPTask的文件,然后 将其放入“ 服务”组中。 HTTPTask负责为特定端点配置参数。 您可以添加适用于您的网络层要求的任意多个案例。 我将提出请求,所以我只有三种情况。 下一节将讨论参数以及如何处理编码参数。 HTTP头 HTTPHeaders仅仅是字典的别名。 您可以在HTTPTask文件的顶部创建此类型别名 。 公共typealias HTTPHeaders = [String:String] 参数和编码 […]

该死,我们刚发售了一款游戏!

Marc Vandehey向您展示了如何在Swift 3中构建SpriteKit游戏 您是否曾经想制作一款游戏,却被开发和设计的复杂性所吓倒? 别害怕我的朋友,十三二十三有你的背! 这个由高级开发人员Marc Vandehey撰写的系列文章分为5部分,展示了为iOS平台制作SpriteKit游戏是多么简单。 小猫,小猫 游戏称为RainCat。 有一个简单的前提:我们要喂一只被雨淋困在外面的饥饿的猫。 具有讽刺意味的是,我们的RainCat不喜欢雨,潮湿时会变得悲伤。 为了避免猫科动物的悲伤,我们必须做个保护伞,尽力(作为保护伞)保持在RainCat上方,让她吃饭,并最终开心。 听起来很简单,对吧? 开发游戏也很容易! 下面列出了所有5个课程。 您只需开始: Mac电脑 Xcode 8 耐心,蚱hopper RainCat:第1课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第2课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第3课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第4课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 RainCat:第5课 如何在Swift 3 medium.com中制作简单的SpriteKit游戏 在 Facebook 和 Twitter上 找到我们, 或者在 thirteen23.com 上 与 我们 联系 。

iOS。 具有Swift泛型的通用单元

首先,我们必须承认在设计上不可能使用UITableViewCell而不是UICollectionViewCell,反之亦然。 因此,最好创建一些可以代替这两个类使用的东西。 UIView是一个很好的起点,因为它是UIKit中最通用的UI组件。 屏幕上显示的所有内容都可以使用它来创建。 我们可以将其放在表或集合单元中,作为其他所有内容的容器。 让我们从这个简单的想法开始。 第一次尝试 您可以看到其中具有任何视图的集合单元。 在这里以及我们进一步假设,很容易为表单元格创建相同的版本,并且省略了这种实现而不重复代码并减少读取时间的实现。 尽管单元格变得更加通用,但是这种方法给我们带来了一些缺点: 我们失去了标准单元的重用,需要自己创建视图池。 这意味着使用UIKit库进行代码复制; 使用xib更加困难,因为我们需要将所有内容都嵌入到视图中。 有一个恒定的视图类型,因此我们每次使用视图时都需要强制转换类型。 视图的框架严格限制为与单元格内容相同。 我们将使用Swift Generics对其进行进一步修复。 第二次尝试 作为第二种方法,我们对之前的代码进行了一些更改: 首先,如果我们要使用系统的重用,则单元格内部的视图不应更改。 这意味着我们将该属性标记为常量,并在单元初始化期间创建一个视图。 其次,让我们使用Swift Generics到处都知道视图类型。 现在看起来好多了。 但是我们仍然需要讨论有关从xib加载的大问题。 您通常需要一个xib名称,有时还需要一个束名称(对于框架而言)才能从xib加载某些内容。 如果xib与视图的类存储在同一束中,则xib名称足以加载视图,因为可以使用Bundle(for:Class)方法从该类接收束名称。 这是需要提供名称的协议LoadableFromXib ; 以及从xib文件加载视图的load方法的实现。 现在,在单元初始化期间从xib加载任何视图要容易得多。 看一下LoadableFromXibContentCollectionCell类中的视图初始化: 因此,现在我们可以使用任何视图创建集合(和表)单元,或者使用初始化程序创建它或从xib加载它。 系统对这些单元的重用( 任何视图)都是免费的。 最后,为了使解决方案更通用,让我们在视图中添加插图,因为单元已负责视图的定位和大小调整。 注意,在单元重用期间必须将内容插图恢复为零。 当然,可以向通用单元格添加更多属性,但是看起来contentInsets属性就足够了,因为通用单元格只负责在其内部定位视图。 总而言之,我们创建了具有以下功能的通用单元: 任何视图都可以轻松地转换为表单元格或集合单元,无论它是从xib加载还是以编程方式创建。 例如: SimpleContentCollectionCell -是包含标签的集合单元。 视图填充或边距不会发生变化,因为可以使用像这样的单元格的contentInsets参数来固定它们: cell.contentInsets.left = 20-从左侧增加20个点的插图。 在单元格上设置一些值时,我们确实知道该单元格的视图类型: cell.view.text =“单元格文本” 我已经发布了这篇文章,以分享一些Swift代码中的有用方法。 希望这会有所帮助。 此外,我们非常欢迎您评论和讨论该方法,并在您的项目中使用它。 另外,请随时下载游乐场以显示桌子高亮状态等:Universal Cells游乐场。 […]

如何为UISearchBar图标设置自定义图像

UISearchBar带有一些图标(UISearchBar.Icon:https://developer.apple.com/documentation/uikit/uisearchbar/icon),例如resultsList和书签: 有时您需要从UISearchController的UISearchBar中为UIBarIcons设置不同的图像或图标,例如,当用户点击以下按钮之一时,我需要显示一些过滤器,例如https://www.linkedin.com移动应用程序: 创建UISearchController 设定: 您需要实现协议UISearchBarDelegate才能知道何时点击按钮。 UISearchResultsUpdating和UISearchControllerDelegate以便出现和使按钮绝望: 最终视图如下所示:

如何开始学习iOS

2年前,我以iOS开发人员的身份开始了自己的旅程,最近我在思考它,我是如何开始的(我是一个自学成才的人),我所经历的挣扎和我决定写一篇关于它的文章,我使用了哪些资源以及更多。 在继续阅读资源列表之前,需要记住一些事情: 我更喜欢阅读复杂的范例,而不是看教程,因为我想在编写任何代码之前有自己的步调并很好地理解事情。 许多iOS开发人员不喜欢我的使用方式(“阅读”),而是喜欢看教程。 您将在下面看到的列表假设开发人员已经了解一些编程知识。 好吧,现在让我们深入研究有趣的东西: Swift的语法 在开始学习Xcode之前,我强烈建议您从Swift的语法开始。 您可以从多种资源中学习,但到目前为止,我发现的最好的东西是Apple在iBook商店中拥有的书“ The Swift Programming Language(Swift 3)”。 来自 www.raywenderlich.com 的iOS学徒系列 就像我说的,我更喜欢读书而不是看书。 因此,我买了这本书,并完成了每个应用程序/练习。 照着做。 动手 不要只是阅读或观看示例。 尝试1-2周以创建您的想法的MVP。 例如,如果您想创建一个待办事项列表。 去做吧。 您将学到很多有关表格视图,手势和姿势的新知识。 另外,作为第一个项目的待办事项清单也是IOS开发中有许多功能的一个很好的例子。 必需品 在学习iOS时,您可以做的另一件事是观看WWDC视频。 它们的介绍非常好,具有教程,您可以学到很多新东西。 例如,当我观看几个WWDC会话时,我对Auto Layout的理解更好。 其他有用的结论 从最近的两年快速学习和编码中,我了解到每个iOS开发人员都会以一种或另一种方式“面对” Objective-C,因此,我强烈建议先学习Objective-C,然后再学习Swift。 我做了相反的事情,这比我想的要困难得多。 在学习过程或“构建应用程序”过程中,您将面临很多问题。 要记住的是要有耐心,当您的代码有问题时,请不要犹豫寻求帮助或在堆栈溢出中提出问题。 iOS开发人员的Twitter社区也非常友好,他们可以为您提供很多帮助。 如果您在此问题上有任何问题,请联系我@AgisilaosTs。 最后的想法 我喜欢iOS开发。 了解每个人如何成为开发人员真是太好了。 。 在开始使用iOS之前,我有一点C ++经验。 上面的列表对我非常有用,我学到了,当然,我每天都在学习新事物。 我希望这也能为您服务。