Tag: 迅捷

带有协议和keyPath()的更安全的Swift应用程序设置

协议+ #keyPath +计算属性=强大的用户设置💪 保持应用程序设置同步,持久化以及分配默认值可能会变得混乱。 UserDefaults是一种存储非敏感应用程序设置的好方法。 但是,由于其本质是键值结构,因此我们需要诉诸使用字符串存储数据的方法。 FL红旗! 这是一个等待发生的问题。 简单的拼写错误可能会导致我们访问无效值,或者无法正确更新值。 使UserDefaults更安全👷 Swift 3及更高版本配备了出色的#keyPath()表达式。 这可以使我们避免以类型安全的方式在UserDefaults中使用字符串。 #keyPath()仍使用Objective-C运行时,并将解析为其引用的路径的字符串。 因此,密钥需要通过@objc装饰器公开给Objective-C。 将密钥包装在协议中可以使我们公开整个协议并干净地访问它们: 越来越好… 好。 所以这可行。 目前可能看起来有些令人费解,但是使用协议将使我们可以为下一步使用一个干净的接口。 添加计算属性 “正在计算…” –🤖 使用此约定,我们可以让协议定义我们的设置,无论它们是Bools,String还是其他。 然后,我们可以创建一个符合协议的对象AppSettings ,并使用计算的属性,可以安全地直接从UserDefaults设置和获取变量! 编译器还将强制执行协议,以确保您不会忘记实现所有设置! 👍 哦,看起来很好 我们的设置现在真的开始变得生动起来了。 您还将注意到,如果UserDefaults中不存在,我们的useAmbientLight变量将被设置为false -这是我们可以为每个设置指定默认值的方式! 设置可以轻松检索! 十分简单。 更深入 大! 我们有一种方法可以轻松安全地存储,设置和检索变量。 但是其他类型,例如字符串呢? 如果您有很多设置怎么办? 破坏我们的协议并使用扩展可以帮助清理我们的课程。 使用上面编写的value(for key:)函数,我们可以轻松获取任何其他UserDefault支持的对象(如String),甚至是Optionals的设置! 完整的例子 包起来 #keyPath,协议和计算属性的组合是为您的Swift应用程序中的设置提供强大功能的强大功能组合。 添加设置就像将其添加到现有协议或创建新协议一样容易。 如果您忘记实现一个,编译器甚至会警告您。 希望这种有趣的实现设置的方式在您的应用中同样有用useful。

使用ARKit飞鲨

您可能听说过Sharknado,这是一部主题非常合理的电影-到处都是飞鲨。 在本文中,我们将尝试使用Xcode中的SceneKit编辑器来实现与ARKit类似的功能。 正如您将看到的,我们不需要大量代码即可完成从窗口传来的鲨鱼的效果,进行几次咬咬然后返回。 结果将类似于下面的视频。 实作 首先,创建一个名为ARAnimals的新的增强现实项目。 接下来,转到提供免费3D模型的网站TurboSquid.com,并选择这真棒的鲨鱼。 鲨鱼有几种格式,但是与Apple的SceneKit(我们用于在ARKit中渲染3D模型的版本)最兼容的是.dae格式或collada。 因此,将其解压缩,您将看到一个扩展名为.dae的文件,以及多个纹理图像。 将它们添加到Xcode项目中,选择.dae文件,将其重命名为sharks,然后在编辑器部分中按“转换为SceneKit场景文件格式”。 这会将collada文件转换为SceneKit文件。 导入后,您将看到以下结构。 在这里,我们不需要很多东西,例如图像平面和两个摄像头。 删除它们,创建一个父节点,然后将Armature和Parent_Sharkbody放在该父节点中,这将被称为shark。 产生的结构应类似于以下结构。 接下来,我们需要设置鲨鱼身体及其牙齿的纹理。 为此,选择Parent_Sharkbody节点,转到“材质”检查器,并将其“漫射”更改为图像Sharktexture002.png,该图像位于下载的3D模型的zip文件中。 这将使鲨鱼的身体有质感。 Parent_Sharkbody的子节点(称为Sharkjaw)包含鲨鱼的嘴巴。 同样,在“材质”检查器中,将“漫反射”更改为图像Sharkmouthtexture002.png。 这会给鲨鱼带来可怕的牙齿。 现在让我们设置鲨鱼的位置。 对于x和y,将0和z置于-5到-10之间。 这会使鲨鱼出现在您的面前。 由于鲨鱼已经在定向中,所以欧拉角钓鱼器的所有轴都应为0。 由于模型很大,因此将x,y和z的鲨鱼比例设置为0.5左右。 在运行应用程序之前,我们应该在ViewController中稍微修改Xcode生成的代码,以便加载场景。 这是在viewDidLoad方法中完成的,该方法将加载sharks.scn场景,而不是默认场景中的ship.scn。 现在,运行该应用程序,您应该会看到一条鲨鱼漂浮在您面前。 接下来,让鲨鱼来找我们攻击我们。 为此,我们将添加移动MoveBy动作,其中偏移量对于z轴为正。 由于鲨鱼已经处于负面位置,因此为了在我们面前看到它,正值会使其接近我们。 另外,当鲨鱼袭击我们时,我们会做出适当反应并让鲨鱼逃走。 为了做到这一点,我们将旋转鲨鱼并添加另一个MoveBy动作(现在为负值),这将产生鲨鱼要离开的效果。 可以像在“库”部分中添加任何其他元素,节点或粒子一样添加操作。 对于第一个移动动作,我们可以指定它在1秒钟后开始,持续5秒钟,并且其偏移仅在z轴上更改10米。 现在,我们需要使用RotateByEuler动作来旋转鲨鱼。 为了使鲨鱼转身,我们需要将其在y轴上旋转-180度。 可以在场景的第7秒完成此操作,此操作将持续一秒钟。 最后,我们需要采取相反的行动,将鲨鱼带回我们的面前,但现在又将其向后转。 运行该应用程序,您将看到鲨鱼降临。 到达后,等待一秒钟,旋转并离开。 为了使它更加有趣,请复制几次鲨鱼节点,然后更改x,y和z的值以及移动动作的持续时间和偏移量。 这将使场景更加恐怖,有许多鲨鱼向您袭来。 此外,当鲨鱼来到您的身上时,您可以添加一些粒子效果,例如可能意味着流血的红点(当然是鲨鱼的血液)。 如您所见,我们已经用最少的代码做到了这一点。 SceneKit编辑器非常强大,您无需编写代码即可完成许多有用的操作。 这个小项目的源代码可以在这里找到。

代表– chandrakant kaski –中

代表 基本上,一个协议,无论谁实现此协议,即授权对象,都将代表另一个对象。 这有助于分离逻辑部分,使其更模块化,而又不违反SRP(单一责任原则),从而使我们的代码更具意义。 例子 : 在不谈太多技术的情况下,我想举一个简单的委托示例,以使问题说明更具意义。 在迅速的世界中也会有一个技术实例。 一般:- 假设您在口渴的同时正在忙于编程,现在您想从厨房取水。 现在考虑可用的选项: 我认为的基本选择是 1-下桌子,带上自己的水。 2-请他人为您带来水。 委托部分到了,这两个都是代表的例子。 现在,根据定义,您将认为第二个意义就是我们已经将给他人供水的工作委托给他人,而现在另一个人将为我做这件事。 我会说是的,委托人的意思是对的,但是现在让我们考虑一下,就像我也可以将工作委托给我自己一样。 为什么更先也可以成为代表团更有意义? 我们应该首选: 好吧,像往常一样,我想说这取决于在某些情况下是否可以使用自我授权,但对于代表团的身份而言却没有意义。 就像我会做的一切。 因此,我宁愿选择第二个人,即我会做我的工作,并告诉另一个人为我做一些工作,而我本可以那样做,但是这就像在打扰自己做需要做的实际工作一样。

实验:iOS网络缓存

现在一段时间以来,我一直在进行网络架构方面的实验。 我已经按照自己的喜好构建了一个,它提供了灵活性和可读性。 我缺少的第一步是持久层。 具有强大的持久层,随后对同一网络资源的调用可以依赖于存储的数据,而不是浪费数据和时间。 对我们来说幸运的是,如果您使用URLSession则默认配置已使用NSURLRequestUseProtocolCachePolicy 。 它是这样的: 如果没有存储响应,它将从网络中获取内容。 如果存储了一个响应并且它是有效的,它将使用该响应。 如果存在已存储的响应并且该响应无效,它将从网络获取以使用并也会更新已存储的响应。 除了存在一个问题外,它还很整洁:并非所有服务器都能正常运行并提供cache header 。 没有它,它将不会存储在缓存中。 我们还有另一种情况,其中存在高速缓存头,但表示为: no-cache 。 在大多数情况下,我们应该尊重所提供的缓存控制标头,因为服务器应该知道最适合它们所提供的内容。 我遇到了Hacker News Top Stories Endpoint的no-cache标头,这很有意义,因为它是根据投票不断变化的新闻列表。 这就是该帖子被称为“ 实验”的原因。 虽然可以使用,但我不建议在生产应用中使用它。 有更好的缓存数据的方法,但是如果您急于需要快速的默认缓存,则可以选择这种方法。 在本实验中,我使用了https://hacker-news.firebaseio.com/v0/topstories.json端点。 单个请求: 我试图对同一网络资源执行多个请求: 然后使用缓存头修改获取相同的资源100次:

Swift中的Class vs Struct

类和结构是通用的灵活结构,它们成为程序代码的构建块。 您可以使用与常量,变量和函数完全相同的语法来定义属性和方法,以向类和结构添加功能。 -Apple Documentaion 让我们通过类比来讨论两者。 名词: 公司常务董事决定增加库存以应对通胀。 他命令部门人员以我提供的模板协作创建当前库存报告。 工作人员创建模板的副本并在其中共享,以便任何人都可以对其进行更新。 审核后,最终报告文档将与主管共享[具有只读访问权限]。 让我们讨论以上对话: 已共享模板以创建报告。 这意味着工作人员只能对模板具有只读访问权限。 如果Director提供了写访问权限,则任何人都可以有意或无意地更新模板,这是不期望的。 现在,要创建报告,工作人员需要制作一个模板副本并在部门之间共享,以便所有部门都可以做出贡献,并且默认情况下将保留修订历史记录。 结构 ==只读访问模板 类 ==部门人员对复制模板的读写访问权限[新文档] 相似之处: 定义属性以存储值 定义提供功能的方法 定义下标以使用下标语法提供对它们的值的访问 定义初始值设定项以设置其初始状态 扩展以扩展其功能,超出默认实现 符合协议以提供某种标准功能 相对于struct的类的附加功能: 继承使一个类可以继承另一个类的特征。 类型转换使您可以在运行时检查和解释类实例的类型。 使用反初始化程序,类的实例可以释放其分配的所有资源。 引用计数允许对一个类实例进行多个引用。 在代码中传递结构时,总是将其复制,并且不使用引用计数。 类和结构这两个主题都很广泛。 我将帖子分为两部分,以详细介绍这两个方面: 第1部分-Swift中的结构 第2部分-Swift中的课程 参考文献: 为什么选择结构而不是课堂 类和结构 https://medium.com/swift-in-sil/var-vs-let-in-sil-6476ccccfa02 谢谢阅读。 您可以随时通过Linkedin或Twitter与我联系

位置跟踪器pt。 1:Swift中的离线优先设计

Location Tracker应用程序的目标是向Swift开发人员展示使用Cloudant跟踪,存储和查询位置有多么简单,同时启用脱机优先设计并提供架构指导以扩展解决方案以支持数百万用户。 在本教程中,我们将向您展示如何构建应用程序以及为实现目标所采用的策略。 我们将向您展示如何将Cloudant Sync用于离线支持和数据同步。 我们将向您展示如何使用Cloudant Geo来执行和可视化地理空间查询。 最后,我们将介绍在以后的教程中将使用的替代体系结构和方法,以向您展示如何扩展应用程序以支持数百万用户。 总览 Location Tracker应用程序是在Swift中开发的iOS应用程序,可跟踪用户位置并将这些位置存储在Cloudant中。 当用户移动并记录新位置时,该应用会查询服务器以获取用户位置附近的兴趣点。 以下是“位置跟踪器”应用的屏幕截图。 蓝色图钉标记应用程序记录的每个位置。 在用户行进的路径上绘制了一条蓝线。 每当Location Tracker应用程序记录新位置时,都会在Cloudant中执行基于半径的地理查询,以查找附近的兴趣点(在应用程序中称为“地点”)。 半径由绿色圆圈表示。 位置显示为绿色图钉: 要求 为了帮助实现我们的目标,我们创建了5个关键要求: 跟踪前台和后台的位置:当应用程序在前台或后台运行时,该应用程序应该能够跟踪用户的位置。 使用地理空间查询来查找指定半径内的兴趣点:该应用程序应向用户展示如何使用Cloudant Geo执行地理空间查询。 脱机运行:该应用程序应能够在脱机时跟踪用户位置,并在网络连接可用时将这些位置同步到Cloudant。 将用户位置信息保密:用户不应有权访问其他用户的位置信息。 提供整合和分析所有位置的能力:后端工程师或数据科学家在不影响第4条要求的情况下,在所有位置执行分析应该很简单。 建筑 为了满足要求4(用户隐私),使用每个用户的数据库设计模式实现了位置跟踪器。 为只有该用户有权访问的每个用户创建一个专用数据库。 运作方式如下: 当用户注册时,Location Tracker应用程序会将用户信息发布到我们的Node.js服务器。 Node.js服务器在“用户”数据库中创建一个新用户。 Node.js服务器创建一个特定于用户的数据库来跟踪用户的位置。 Node.js服务器将数据库名称和身份验证信息返回到应用程序。 该应用程序直接连接到Cloudant以同步位置信息。 稍后我们将详细讨论。 这是系统架构的高级示意图: 除了创建相邻架构图中所示的特定于用户的数据库之外,服务器还为每个特定于用户的数据库配置连续复制到统一数据库( 所有位置 )中。 通过为我们提供一个位置来查询和分析所有用户记录的所有位置,同时又不损害用户安全性和隐私性(没有向用户提供直接访问统一数据库的权限),这满足了要求#5(位置合并和分析)。 注意: “每用户数据库”设计模式使您可以轻松地在iOS应用程序和Cloudant之间同步位置信息,同时确保信息保密。 对于中小型应用程序来说,这是一个很好的解决方案。 在下一个教程中,我们将向您展示复制用户隔离的数据的替代方法,以及如何扩展应用程序以支持数百万个用户。 服务器 Location Tracker Server是一个Node.js应用程序,它提供RESTful API,用于使用Cloudant Geo注册新用户和查询位置。 安装Location Tracker […]

Swift服务器端

Partiamo dall’inizio… 2014年 苹果公司在世界范围内的通用计算机世界大会上(Apple C)的目标是完成语言程序(目标C)实用程序的使用,并在每个操作系统上都使用了Mac OS,Mac OS, watchOS)。 Il scelto per il nuovo linguaggioèSWIFT(dall’inglese“ rondine”,“ rapido”)。 快速达成共识, 迅速达成目标,在目标C的客观C行为中使用未成年人的犯罪行为。 可能因语言问题而无法使用Apple Consiglia的问题。 Swiftpuòben definirsi il risultato di una attenta selezione darwiniana (in cui l’uomo recita la parte della natura)cheèavvenuta negli anni nel campo informatico dei linguaggi di programmazione。 环境问题的复杂性,法律法规的统一性,通用汇编的通用性,机械化性,社会责任性和经济性程序语言的现代性。 迅速在马塞拉俱乐部的“ rapida”和dirompente俱乐部工作,并且在“锈”,“ Haskell”,“ Ruby,Python,C#,CLU [2] 达尔文语录中的自动翻译和加注时间(按问答集进行统计)和预选书翻译,[1] 更少的代码 可以迅速地从法律法规和法律法规中获得自然权益。 […]

在iOS 10中将领域和图表与Swift 3结合使用

当我阅读有关如何一起使用Realm和Charts的一些教程时,我面临的挑战很少。 主要是因为我发现的所有教程都是针对Swift 2和旧版本的Realm和/或Charts的。 因此,我决定在GitHub上创建一个简单的示例项目,并写下所采取的步骤。 这是为了让我更好地记住,并希望能帮助其他遇到相同问题的人。 关于本教程 本教程从创建新项目开始,并假定读者已经对Xcode和Swift有所了解。 在此示例中,我们制作了一个简单的应用程序,您可以在其中计算访问者,并通过按按钮将当前计数和日期添加到数据库中。 然后它将立即显示在图表中。 本教程中使用的软件 这是我在本教程中使用的已使用软件的列表。 如果您的计算机上尚未安装CocoaPods,请从下面查看安装指南,因为需要遵循该指南。 Xcode 8.0(8A218a) CocoaPods(1.0.1)( 安装指南 ) RealmSwift(2.0.2) 图表(3.0.1) 您最喜欢的用于编辑Podfile的文本编辑器(我使用Sublime Text) 建立新专案 启动您的Xcode并创建新的Xcode项目。 然后选择Single View Application,然后单击Next 。 现在,我们为项目设置选项。 您可以使用任何想要用作产品名称 , 组织名称和组织标识符的 名称 。 根据需要填充数据后,单击“ 下一步” 。 接下来,您将选择要存储在设备上的项目的位置。 在此示例中,我选择了桌面。 如果您想为项目创建Git存储库,请选中Source Control 。 此后,将创建您的项目,并向您显示类似的Xcode。 现在关闭Xcode。 使用CocoaPods 接下来,我们将为项目设置CocoaPods。 为此,您必须打开终端并转到创建项目的文件夹。 因为我们确实将本教程中的项目保存到了桌面,所以我们将这样写到终端: cd桌面/ RealmAndCharts示例/ RealmAndCharts示例/ 现在您位于正确的文件夹中,我们准备设置CocoaPods。 因此,将以下命令写入Terminal。 荚初始化 CocoaPods将生成一个名为Podfile的文件。 在您喜欢的文本编辑器中将其打开。 […]

iOS-使用自定义颜色扩展UIColor

然后,我将打开一个颜色选择器以获取所选颜色的RGB值。 最后,我将打开Xcode并使用这些值创建颜色🙄无聊吗? 这种方法非常令人沮丧,因为每次: 我必须打开Safari并搜索图片 打开拾色器 用RGB值创建颜色并添加255的丑陋除法 我需要的是像Swift 3之前一样的UIColor.redColor()和Swift 3之前的UIColor.red这样简单的东西。 我想出了一个非常简单的解决方案:使用自定义结构扩展UIColor! 让我们跳进去吧! 🙃 第1步-创建一个新的iOS项目 创建一个新项目,这里没有新内容。 选择Swift作为语言,您就完成了。 步骤2 —阅读具有十六进制值的颜色-第1部分 在大多数情况下,指定颜色时,与具有颜色的十六进制值相反,写入RGB值很无聊。 给定十六进制值,任何本机UIColor初始化都不能给出颜色,因此我们必须编写一个。 第一步是从十六进制获取RGB值。 这需要一点点按位操作,如果需要,您可以跳过下一部分,说明我们将如何进行。 a什么是十六进制值? 我们如何使用它并提取有趣的信息? 步骤3(可选)—让我们玩十六进制 例如,在上面的纯色图像中,我最喜欢的是Terra Cotta,其十六进制值为0xE66B5B (请注意,第一个字符为零)。 我们想从此十六进制提取RGB值,但是为此,我们必须掌握并了解什么是十六进制值以及如何生成它。 在底层,十六进制值只是一个整数。 您可以通过打开Playground来快速检查以下内容: 现在,要获取十六进制值的红色部分,我们向右移动,但是有多少位? 🤔 我们看到我们必须摆脱E6右边的4个十六进制值,即蓝色和绿色,即6 , B , 5和B ,每个值编码为4位,共16位。 然后,我们以十六进制形式将其移位16位: 因为我们只想选择最后两个十六进制值(6和B),所以我们将应用以下掩码0xFF: 现在,&运算符将逐步应用: 1&1 = 1 1&0 = 0 0&1 = 0 0&0 = 0 基本上,当我们将遮罩应用于另一个值时,它将选择遮罩中为1的所有内容,并将其他所有内容为0。 如果我们回到所需的位置,则在平移和&操作后,我们最终选择了所需的零件6B […]

带RxSwift示例的FRP(#1)

如今,Reactive编程对于许多语言的开发人员世界来说并不陌生。 对于此博客,它将专注于Swift和ReactiveX公司的强度库,绝对是RxSwift,它是2年前成长的语言。 如果您已经熟悉FRP的概念,请跳到下一个示例。 关于FRP概念,请深入阅读我之前的2个博客:这个和另一个。 如果您什至没有时间阅读2个我的博客,则以下是一个简短的FRP: 甚至在Swift宣布之前,功能性反应式编程(FRP)与面向对象的编程相比,近年来已获得了极大的普及。 从Haskell到Java语言,您将找到FRP启发的实现。 为什么是这样? 玻璃钢有什么特别之处? 也许最重要的是,如何在Swift中利用这种范例? “功能性反应式编程”是由Conal Elliott创建的编程范例。 他的定义具有非常具体的语义,欢迎您在这里进行探索。 对于更宽松/简单的定义,功能性反应式编程是其他两个概念的组合: 响应式编程 ,其重点是异步数据流,您可以侦听并相应地做出反应。 要了解更多信息,请查看此出色的介绍。 函数式编程 ,它强调通过数学风格的函数进行计算,不变性和表达性,并最大程度地减少了变量和状态的使用。 要了解更多信息,请查看我们的Swift函数式编程教程。 一个例子 值得说明的一个例子表明FRP的效果就像在UITableView和UISearchBar之间组合搜索某物。 首先,我们需要一个podfile来获取所有和您的依赖项: 要完成,我们有以下这些东西: 接下来,UI将如下所示: 这是准备工作,现在让我们编写代码。 假设您想在您的城市中找到一个或多个IT公司。 尽可能多地创建一个虚拟公司。 同样,您可以制作一个API来响应有价值的数据,但是请避免这样做,因为我们不需要而且从不专注于此,因此会花费很多时间。 虚拟数据,例如: var foundCompanies = [String]() 让companyDummy = [“ Apple Inc”,“ Microsoft Co。”,“ Nokia”,“ Yahoo”,“ Snapchat”,“ Twitter”,“ Facebook”,“ Google”,“ Bings”,“ FPT软件”,“ Framgia”] 开始了! 然后,我们将设置扩展表视图的数据源,如下所示: 拖放tableview,searchBar引用: @IBOutlet弱var searchBar:UISearchBar! […]