Tag: Grace Elliott

设计模式—创新模式— Swift中的工厂模式

作为一名崭露头角的计算机科学家,您无疑已经听说过课堂和学习途径中的设计模式。 设计模式是蓝图,概述了创建可重用的面向对象代码,解决常见软件问题的最佳实践。 为了避免给您带来长期的历史教训,我将描述设计模式的起源可以追溯到1970年代,但是随着1994年发布并由Erich Gamma撰写的《设计模式:可重用的面向对象软件的元素》的发布而获得了广泛的接受。 ,理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗利斯赛德(John Vlissides),统称为四人帮 (GoF)。 由于对23种经典软件设计模式进行了描述,因此该书大获成功。 设计模式对于帮助您将复杂的系统分解为通常适合于GoF描述的一种设计模式的组件非常有用。 因为我知道作为开发人员,我们喜欢学习,有时需要快速参考才能更好地完成工作,所以我要花时间写一系列文章,这是第一篇,以展示如何使用每种GoF设计模式在Swift中。 通常将设计模式分为几类相关的类别:创建模式,结构模式和行为模式。 在本文的其余部分,我们将重点介绍“ 创造”模式,并介绍我们的第一个模式:“ 工厂”模式。 创作模式:工厂模式 创建模式都是关于消除创建对象所涉及的复杂性的方法。 工厂模式是一种封装创建对象的实现细节的方法,该对象遵循通用的基类或接口。 工厂模式允许接收创建对象的客户端通过公共接口使用对象返回,而无需关心实际创建的具体对象的类型。 工厂模式将创建对象的实现细节与允许用户通用使用该对象的公共接口分开。 让我们考虑一个使这个想法更具体的例子。 想象一下,您经营一家猎头公司,其所有线索均来自各个工作委员会。 对于每个工作委员会,您都收集联系人详细信息并针对潜在的“目标”进行简历。 我的意思是求职者。 获得联系信息后,您可以对其进行分类,并向每个联系人发送样板电子邮件,告知潜在客户与他们的潜在匹配。 您想自动化该过程,因为您每周都要连接数百个潜在客户。 从本质上讲,您只是“以美元计价”,因此您可以处理的潜在客户越多,将潜在客户放置到头寸中的机会就越大,获得报酬的可能性就越大。 我们可以并且将使用工厂模式来解决此问题,以处理电子邮件模板的创建。 我将使用Swift Playground展示一种可以使用工厂模式实现目标的方式。 您可以在这里找到我用于此帖子的操场文件。 为简化起见,我们假设每个联系人将具有个人详细信息以及他们所寻找的角色类型。 首先,我们将创建用于将定制的电子邮件发送给潜在客户的接口(或更确切地说是协议),其中包含有关他们正在寻找的工作类型的信息。 而已! 我们的工厂示例已完成。 现在,我们可以根据他们寻求的工作类型向他们的联系人发送自定义的电子邮件。 只要我们的需求发生变化,我们就可以扩展我们的示例,并且只要我们的界面不变,就不必更改客户端使用的代码。 这意味着我们可以添加新的作业和求职者对象,以将自定义的电子邮件发送给新的联系人类型,而无需更改使用JobContactProtocol的客户端。 我们还可以更改用于创建模板的逻辑,因为这仅包含实现更改。 包起来 工厂模式使我们可以通过允许客户仅依靠公共接口与对象进行交互来隐藏创建对象的实现细节。 这使我们可以消除创建具有类似行为需求的对象所涉及的不必要的复杂性。 工厂模式还促进了分离和抽象,这两者都导致了易于维护的可重用代码。 您可以在此处找到本文的游乐场文件。 简要地说,我还写了一篇文章,说明为什么创建本地应用程序可能是大多数移动开发工作中最好的方法。 阅读并参与讨论! 您的混合应用程序将杀死您 如果您的公司仅开发混合应用程序,那么最终您将蒙受损失。 这只是时间问题。 混合手机… medium.com 如前所述,我将完成一系列有关设计模式的文章。 您可以在下面的文章链接中阅读有关装饰器模式的下一篇文章。 Swift中的设计模式—结构模式—装饰器模式 […]

了解如何使用Swift构建iMessage应用

iMessage应用程序是Apple使用iOS设备推动更多对话的最新尝试。 仅需少量代码,您就可以创建扩展,以将自定义逻辑和交互添加到Apple的iMessage应用。 在本文中,我将向您展示如何创建一个简单的iMessage应用程序,该应用程序可让您在iMessage对话中与朋友评价图像。 消息框架 Messages Framework允许您扩展iMessages来创建两种类型的扩展名:贴纸包和iMessage应用程序。 Apple允许您将扩展程序创建为独立应用程序或现有应用程序的扩展程序。 贴纸包 贴纸包是两个扩展中较容易创建的,因为它们不需要代码。 贴纸包只是包含图像的资产目录,用户可以将其附加到消息提示框上。 您可以在此处了解有关图像要求(尺寸,格式等)的更多信息。 iMessage应用程序 iMessage应用程序使您可以与iMessage应用程序进行更深入的集成。 iMessage扩展可以创建自定义UI,以在iMessages中呈现给用户。 您还可以为用户创建动态标签,或将富媒体类型插入对话。 iMessage应用程序可以利用MSMessage和MSConversation对象来创建交互式内容,甚至可以更新对话中的消息。 在创建iMessage应用程序时,Messages框架为您提供了很多控制。 本文的其余部分将重点介绍如何创建iMessage应用程序以及您需要了解的主要类。 立即评价 我们的示例iMessage应用程序称为Ratethisnow 。 我们的应用程序可让您对1到5星的图像进行评分,并与朋友分享您对图像的其他评论。 为了简化此发布的示例,我们将示例限制为只有2个用户,以便我们可以使用iPhone Simulator。 我在演示中还使用了其他一些东西来简化事情。 当它们出现时,我们将进行覆盖。 应用程式设定 启动Xcode 8并创建一个新项目,在iOS选项卡下选择iMessage Application模板。 命名您的项目ratethisnow 。 如果您只是想继续,可以从Github获得我的示例项目。 让我们快速看一下项目浏览器。 iMessage应用程序的模板包含一个入口点( MessagesViewController.swift )和一个故事板( Maininterface.storyboard ),我们可以为其添加自定义视图。 单击MessagesViewController并查看内容。 我们的swift类继承自MSMessagesAppViewController,并且覆盖了其几个类。 MSMessagesAppViewController是iMessage扩展的主要类。 您需要重写子类中的方法才能与iMessage进行交互。 您可以在此处了解有关文档中可用方法的更多信息。 您还可以在“应用程序扩展编程指南”中获得应用程序扩展的更广泛概述。 模型 我们的应用程序允许用户创建商品的评价并在对话中分享。 创建一个新的名为RTNItem的 swift类作为我们的模型对象。 我们需要存储标题,图像和用户评分。 如前所述,我们将采取一些捷径来使本文易于管理。 因此,我们将仅允许两个评估者,因为iPhone Simulator仅包含两个可用于测试的用户。 您当然可以将其更改为适合将来用途的系列。 接下来,我们需要配置两个Collection视图单元:一个用于创建按钮,另一个用于标签类型。 […]

从Swift到Javascript然后返回

调用函数和评估脚本 所有这一切真正酷的是,您拥有支持WebKit(iOS和MacOS的Safari)的JavaScript引擎。 该增加一点时间了。 我喜欢为iOS开发,但我也花了很多时间为Node.js和网络开发。 我经常使用JavaScript库来减少必须编写的代码量,因为那里有比我更聪明的开发人员,他们已经进行了一些繁重的工作并创建了一些非常有用的东西。 因此,下一步是了解如何在代码中包含和使用现有的JavaScript库。 对于我们的示例,我将使用Moment.js来简化一些日期时间操作。 顺便说一句,我在所有实验中都使用了Playground。 如果您想继续,请使用iOS目标创建一个新的Playground文件。 从那里,您需要Moment.js库的JavaScript代码,该库是我使用Bower在本地安装的。 接下来,我将moment dir复制到Playground的Resources文件夹中。 如果您对此有疑问,可以参考我的其他一篇有关使用Playgrounds的文章。 接下来,我们需要找到moment.js文件的路径,将文件内容复制到String中,然后将其注入到JSContext中 。 请参阅下文,了解如何实现此目的。 这里重要的一点是,如果您调用JSContext的validateScript ()方法,则您正在执行的代码(在我们的示例中)将整个moment.js库添加为该特定JSContext的全局对象。 以后添加的任何脚本或JavaScript对象都可以使用moment.js的所有功能。 好吧,至少听起来不错。 事实是,这取决于您注入JSContext的脚本的内容。 为了使Moment.js库正常工作,我们需要通过另一个评估脚本调用来调用它的构造函数和格式函数。 完成此操作后,我们可以使用JSContext的objectForKeyedSubscript方法获得对moment.js库的引用,该方法将为我们提供初始化的moment.js对象。 有关如何调用方法或使用参数调用构造函数的一些示例,请参见上面的示例,这些示例在幕后使JavaScript发生了正确的事情。 一切都很强大。 扩展示例 继续前进,我想提供一个更深入的示例,让您考虑在自己的代码中实际使用它的可能性。 我们将创建一个用于显示联系人的小应用程序。 每次执行时,我们仅使用JavaScript库Faker代替真正的联系人,为我们提供新的联系人详细信息。 我们的示例将使我们能够在Swift中为联系人对象建模,并在Swift中创建可以在JavaScript中执行的函数。 我们还需要从具有“伪造”联系方式的JavaScript方面获取数据。 最后,我们将使用WKWebView实例在Playground的视图中显示联系人。 第一步是创建一个联系人对象和一个JSExports协议,该协议概述了我们想要向JavaScript公开的内容。 之后,我们需要使用JSContext的setObject方法来使我们的联系人对象可以在JavaScript中访问。 下一步是创建可以在JavaScript中执行的Swift函数。 我们需要使用@convention(block)语法将Swift闭包转换为一个块,该块将成为具有相同参数和返回值的JavaScript函数。 我们再次调用JSContext的setObject方法将方法传递给JavaScript。 但是,这一次,我们需要使用unsafeBitCast方法将Swift闭包转换为AnyObject类型,以使JavaScript能够正确处理。 我们的下一系列操作旨在向您展示如何从JavaScript调用和使用contact对象以及我们的createContact函数。 您将创建一个contact.js脚本并将其添加到Playground的Resources文件夹中。 我们的脚本将具有一个使用Faker.js库创建虚假联系人的函数。 目的是调用该方法以将新联系人添加到Playground中的视图中,并返回创建的联系人以进行进一步检查。 上面的代码为我们要向JavaScript公开的另一个对象创建了JSExports协议和类。 我们还将这个新类添加到我们的JSContext中,以便可以通过JavaScript对其进行访问。 另外,我们创建Swift方法将新的联系人对象添加到我们在Playground中可以看到的视图中。 接下来,我们需要将Faker.js库添加到我们的JavaScript环境中。 我们遵循用于添加Moment.js的相同模式。 我们还将我们的contact.js文件添加到我们的环境中,该文件将createFakeContact()方法添加到我们的全局范围中。 然后,我们在本机端获取对createFakeContact()方法的引用并执行它。 我意识到JavaScript与Swift中发生了很多来回的变化,但坦率地说,这是关键。 我希望您看到您可以轻松地来回传递对象并从任一侧执行方法。 我们需要做的最后几件事是添加page.html文件,该文件由WKWebView在我们的ContactDrawable类中加载。 为了显示我们的联系人,我创建了一个UIView并将其分配给XCPlaygroundPage.currentPage.liveView 。 执行Playground将显示一个简单列表,其中包含随机创建的“伪造”联系方式。 […]