Tag: swift

Swift中代码的出现

上个月,我参加了Advent of Code,这是一个每天编写小型程序难题的日历。 这些难题通常可以用一百行左右的代码来解决,而在诸如Python这样的高生产率语言中,它们最容易解决。 我解决了Swift中的难题,从而获得了有趣的体验。 (好的,坦白的说,随着圣诞节的临近,难题变得更加耗时了,正好在我没有时间的时候,所以我还没有全部完成。) 总体而言,在Swift中进行代码问世(AoC)很有趣,但是一路上遇到了一些障碍,使事情变得比应有的尴尬。 当我浏览拼图时,我记下了我遇到的每个“剪纸”,并在下面以不特定的顺序展示它们。 其中大多数与标准库有关-语言本身的生产力非常高。 出口() 在简短的脚本程序中要做的一个非常普遍的事情是结束程序。 在AoC中,这经常在我的程序找到解决方案并且想要完成时发生。 Swift中有哪些选项? 您可以调用fatalError()但这是不对的-它会打印出令人恐惧的堆栈跟踪。 正确的解决方案是exit()但是很奇怪,这不是标准库的一部分,您必须import Darwin才能使用它。 这意味着您的程序无法在Linux上编译,因此您实际上必须这样做: #if os(Linux) 导入Glibc #其他 进口达尔文 #万一 //现在我可以调用exit() 退出(0) 啊。 Swift应该将exit() (或类似的东西)添加到标准库中。 对数组求和 想要将一个数组的所有元素相加是非常普遍的。 在Swift中,您可以这样操作: 设total = array.reduce(0,+) 我认为诸如reduce()类的功能概念对于像求和数组之类的简单操作来说是不必要的复杂性。 将array.sum()添加到标准库是合理的。 实现将是这样的: //这应该在标准库中 扩展序列,其中元素:数字{ func sum()->元素{ 返回reduce(0,+) } } //现在我可以这样做 让总数= array.sum() 常用表达 目前,在Swift中,没有语言或标准库支持正则表达式。 要使用正则表达式,您必须import Foundation并处理NSRegularExpression ,这不是现代的Swifty API。 正则表达式在一些难题中很有用,Swift当然应该在语言中添加正则表达式文字。 上壳体和下壳体 […]

调试iOS-给初学者的小技巧

错误在每个人的生活中都是正常的。 但是,如果您是一名开发人员,那么它是日常生活,每小时生活的一部分。 当我开始编程时,我完全不顾为我们的工作提供的一些更重要的工具。 我的意思是:遇到了PHP错误? 让我们逐行阅读代码,直到弄清楚到底出现了什么不良值。 然后向我介绍了Codebug,尽管我很难弄清楚如何入门,但它开始成为我的开发环境的一部分。 好了,然后我决定再次练习iOS,这种新闻习惯使我意识到XCode调试器的功能多么强大。 如果您完全不熟悉,请给它一个机会! 转到代码的某一行,并通过单击左侧装订线设置断点。 这将创建一个蓝色标记,如下所示: 现在,还记得人们何时告诉您打印变量以发现其值吗? 这就是本文的重点。 您可以使用de LLDB(代表低级调试器)来简化此值! 只需在变量前输入“ po” , Code Sense将会帮助您: 选择一个变量,然后: 另外,请确保在底部选择正确的选项: 希望这可以为您节省大量时间,因为运行和仅捕获某些值的iOS可能需要几分钟。 干杯!

用户注册用例中的第一个重构

我们可以“第一时间正确”获得系统是一个神话。 这篇文章是基于另外两个帖子。 首先检查它们以获得更广泛的了解: 使用TDD https://medium.com/cocoaacademymag/authentication-rules-in-a-handcrafted-ios-application-with-tdd-8db5396ebac6的手工iOS应用程序中的身份验证规则 使用集成测试在iOS上进行Firebase用户注册https://medium.com/cocoaacademymag/firebase-user-registration-at-ios-with-integration-tests-fa450e4ec8bb 这篇文章将为您提供有关我在项目中所做的更改的更新。 这些更改在此提交中。 我还将谈论: 单一责任原则 实体 测试驱动开发和单元测试 问题 在写这个项目的最后一篇文章时,我意识到我的用户注册用例不止一个责任。 这打破了第一个SOLID原则,即单一责任原则。 用例具有验证数据和跨其他层传递数据的复杂性。 现在我已经知道责任在哪里,是时候提取代码并对其进行测试了。 负责进行格式验证的代码将提取到小类中,这些小类将负责单个目的。 这些类称为实体。 实体封装了企业范围的业务规则。 实体可以是带有方法的对象,也可以是一组数据结构和函数… …它们封装了最通用和最高级的规则。 当某些外部变化时,它们变化的可能性最小。 马丁,罗伯特。 “清洁建筑” 2012 我只显示ValidateEmailEntity 。 因为其他实体遵循相同的过程。 所以我从 实体测试。 第一种情况非常简单,只是空电子邮件的断言,应该是无效的。 并使此测试成功运行。 下面的代码已经足够了。 在这个简单的场景之后,我开始增加测试的复杂性。 通过电子邮件使用无效字符,没有提供者,不完整和特殊字符来进行断言。 幸运的是,一个简单的正则表达式(可在Stack Overflow上找到)使所有方案都通过了。 下面的代码显示ValidateEmailEntity是如何获得的。 为每个数据格式验证创建一个实体后,我将回到用例并利用这些实体。 以下是具有多个职责的旧用例: 旧用例 重构(添加13个和删除24个)后, 用例更加简洁易懂: 如您所见,我还创建了一个具有isValid属性的协议,以促进错误验证。 另一个得到相应的错误。 可能要注意的是,我还创建了一个协议来保留某种模式,这对于仅过滤无效输入很有用,并且我还创建了一个error属性。 并且由于我正在测试与用例分开的验证,因此不再需要在用例级别上测试所有数据变体。 因此,我运行了测试,所有测试都是绿色的,重构成功完成。

在Swift中使用iOS UIResponder链打开URL

创建iOS应用程序时,我们发现需要一些按钮或UIControls打开URL链接。 这可以通过调用open(_:options:completionHandler 🙂轻松完成。 UIApplication的方法。 通过在iOS 9中添加SFSafariViewController,这为显示链接而无需用户离开应用程序提供了新的可能性。 虽然可以从代码中的任何位置调用UIApplication open(_:options:completionHandler 🙂 ,但仅从 UIViewController可以显示SFSafariViewController 。 我最近正在开发一个应用程序,该应用程序从JSON对象解析并构建交互式文档。 在构成交互式文档的多个对象中,有一个简单的链接对象。 如果用户点击链接,我们将在不离开应用程序的情况下将内容呈现在SFSafariViewController ( SafariVC )中。 应用程序的层次结构类似于下图: 在根目录下,我们有一个导航控制器,并在看到链接后有多个嵌入。 棘手的部分是将用户交互从链接一直传递到根视图控制器,因此我们可以通过将SafariVC推送到导航堆栈中来呈现SafariVC。 可以使用多种解决方案来解决此问题。 其中之一是将DocumentController分配为Link上TouchUpInside事件的目标,并使用didTapLink(_ link:URL)回调公开Delegate属性。 然后要求DocumentGridController将其父级分配为其子级的委托。 这似乎是一个可行的解决方案,但是它涉及很多约束: – LinkView必须是UIControl , – DocumentController需要了解Link , – TopicViewController需要遵守协议, – DocumentGridController需要知道其父项并将其分配给其子项。 这变得非常混乱并且难以维护。 最重要的是,如果我们从其他地方提供一个DocumentController ,会发生什么? 我们应该始终记住分配一个委托并实现相应的协议。 如果我们可以使用与iOS触摸处理相同的逻辑怎么办? 目的是在层次结构中传播打开链接的动作。 因此,该层次结构中的每个对象都可以决定是否可以打开URL或将其传递给下一个URL。 如果您不熟悉UIResponder链,我建议您阅读:使用Apple文档中的使用Responders和Responder链来处理事件。 这是一个图表,显示了如果使用UIResponder链进行URL调用,则传播将如何进行。 一旦点击链接,它将传播一个打开URL的调用。 所有中间视图和控制器都将转发它,直到到达将对其进行处理并推送SafariVC的TopicViewController为止。 这是协议和实施的片段: 每个符合URLHandler的类都可以通过响应者链接收URL请求。 UIResponder扩展中的函数broadcastURL将触发传播: 这将确保链尚未结束。 否则,将返回失败 然后它将检查下一个响应者是否无法处理URL。 否则,它将进行传播 如果下一个响应者可以处理URL,它将要求其处理URL。 […]

谷物之旅#10

#2 Google推出了Angular 2.0的最终发行版 #3如何反应本机模具 #4 Swift 3.0,不可预知的苹果官方程序版本 #5您的App Store优化指南(ASO) #6可变字体,一种用于灵活设计的新型字体 #7使用Sketch快速销毁并加快移动速度 #8吉拉新火车站7.2X和服务台3.2 #9人机工程学,UX设计与设计思维 #10 Adblock Plus酒吧和酒馆

重新练习

关于将Redux-Style应用程序体系结构用于iOS应用程序存在一些嗡嗡声。 该模式绝对值得仔细研究,并具有一些巨大的优势,但是在实践中效果如何? 关于ReSwift的许多介绍已经在那里,但是,我还没有看到有关如何在实际的可交付应用程序中应用ReSwift的出色示例。 在本文中,我试图演示如何使用ReSwift构建几乎“真实世界”的应用程序,同时使所有内容都可测试并与系统API和网络服务很好地集成。 如前所述,已经有大量的信息介绍ReSwift了,我正在努力使其简短。 单向数据流意味着没有将您的应用程序状态保存在许多不同的地方。 取而代之的是,存储组件将所有状态保持在中央位置。 视图对这种状态的更改做出反应,而不是在内部进行处理。 动作是触发状态更改的唯一方法。 动作不会自行执行状态更改,而是将它们更像是表示某些内容将发生更改的消息。。这些“消息”是针对使用执行实际状态更改的Reducer的Store对象发出的。 还有中间件来处理副作用,稍后将介绍。 这种方法有一些很大的好处: 业务逻辑与UI保持独立 减速器具有纯功能-非常适合测试 视图内的简单逻辑-只需对状态更改做出反应并将操作发送到存储 可以在多个视图(或其他组件)之间轻松共享状态 与标准MVC相比,总体而言,方法更加清洁 有一个反例以非常基本的形式展示了上述架构。 在该示例中,一切看起来都很干净,但是通常的应用程序开发要复杂得多。 操作系统或第三方框架提供的异步操作(例如,网络连接)和功能需要集成。 本文的其余部分介绍了如何设置一个经过全面测试(UI除外)的示例应用程序,该应用程序集成了CoreLocation和Google的网络服务,该服务需要用户的位置。 以下是要求的简短列表: 处理位置权限并对其进行更改。 获取用户位置并更新用户移动。 接收到用户的位置后,在附近显示餐馆。 您可以在GitHub上查看所有源代码。 对于每一步骤,至少有一个提交。 每个步骤都将提供指向相应源代码的链接。 项目设置 作为起点,已经存在一个将ReSwift作为依赖项的Xcode项目。 此外,围绕Google Places API的简单网络抽象以及用于检索地点(更好的餐厅)信息的相应模型类已经在那里。 显示餐厅的第一步是设置所需的ReSwift对象:Store,Reducer和State。 中间件的定义如下: 更新操作 -如您在上图中所看到的,现在需要两个操作来获取和设置位置。 (此处设置表示更新状态。) 与以前不同,不需要执行任何副作用,因此不需要中间件。 而是需要一个Location Observer器。 在外部,它的行为几乎类似于某些UI组件,但是它不是根据用户输入发送动作,而是在状态发生特定变化时发送动作。 LocationObserver的重要部分。 仅局部观察该状态,并在newState上调度提取位置操作。 上面的代码段显示了观察位置变化的实现。 同样,这里省略了集成和测试。 您可以在此处看到完整的实现:65bef0d 这样就完成了示例应用程序的工作。 您应该能够构建和运行该应用程序。 授予位置权限后,您应该可以看到周围的餐厅,而移动餐厅时,这些餐厅应会自动更新。 在本文中,我比其他大多数文章更深入地介绍了用ReSwift编写应用程序的细节。 在处理副作用时,我展示了中间件的大量使用。 这有点违背提供的示例项目(例如GitHubBrowserExample),但将动作和网络逻辑分开,并提高了可测试性。 好消息是ReSwift足够灵活,可以调整应用程序体系结构以满足您的需求。 另一方面,我对标准模式没有将副作用与行动分开并且没有提供良好的策略测试感到非常不满意。 […]

带有堆栈视图的可扩展单元

在表视图中有多种创建可扩展单元格的方法。 您很少可以在此博客或Google的某个地方轻松找到它们。 其中之一是苹果官方的“日期单元”演示代码。 但是,大多数描述都是通过直接在约束上使用操作来描述一些困难的方法。 今天,我想通过使用自iOS 9.0以来给我们提供的优势(称为UIStackView)来介绍一种更简单的方法。 我将建立一个简单的编程语言列表,并可能点击标题并显示简短描述。 设置表视图 第一步是设置表格视图。 我希望这个过程是您熟悉的familiar️。 我更喜欢将表视图数据源与主视图控制器分开,以保持代码的清洁和可维护。 为此,我创建了DataSource类,该类维护所有表视图源逻辑。 从数组中检索数据(例如在单元格上显示)的通用模式是这样的: items [indexPath.row] ,我想简化此过程,因此我编写了对数据源类的简单扩展: “ ProgrammingLanguage”只是一个表示表示单元格中显示的数据(图像,标题和描述)的结构。 您可以从我的GitHub页面(下面的链接)下载整个项目。 设置单元 前面的步骤是iOS表格视图的典型步骤; 现在我们将创建我们的单元。 我们应该从情节提要文件开始,将自定义单元格添加到表格视图中: 只需将单元格拖动到表格视图,然后对堆栈视图执行相同的操作。 您需要做的最后一件事是将两个或更多视图放入堆栈视图,并根据需要自定义其外观。 您应该遵循的模式是,第一个视图是对用户始终可见的折叠视图。 关键是为折叠视图设置一些高度。 在我的情况下为50,但是如果要创建更大的折叠单元格,则应设置其他值。 使用堆栈视图并手动更改其子视图的高度或宽度时,您还应该记住正确配置此控件。 这是我的细胞的一个例子: 如果您此时离开视图配置,看到扩展单元格“ 无法同时满足约束条件 ”时,您可能会感到失望。 ”显示在您的控制台上。 原因很简单-隐藏视图的高度限制为0 ,因此,如果扩展单元格,则将与堆栈视图的总高度发生冲突。 幸运的是,修复非常简单。 只需将折叠的视图高度约束优先级更改为999。 在对情节提要中的单元格进行样式设置后,我们需要将其连接到真实代码。 为此,我们需要创建一个继承UITableViewCell并根据需要进行基本设置的类。 这里的关键部分是创建单元状态,该状态描述了应该折叠还是扩展单元。 Swift枚举在这里会有所帮助。 如您在上面看到的,我添加了“ carretImage ”属性,该属性决定了在当前状态下我们应该在单元格上显示什么carret图像。 另外,我们需要允许我们更改单元格当前状态的属性或方法。 这里的逻辑很简单。 我设置默认状态(.collapsed),并使用观察者属性调用toggle()方法,该方法隐藏或显示我们的“展开视图”。 而已! 😆。 我们完成了单元-代码和UI。 设置拼图! 最后一步是将数据连接到单元。 我们通过实现cellForRowAt indexPath方法来实现 […]

iOS:如何使用可折叠部分构建表视图

第2部分。继续通过表视图采用协议和MVVM 这是我的“表视图”教程系列的第二部分,其中包含多种单元格类型。 在阅读了第一部分的多种回答和建议之后,我决定添加一些主要更新。 UITableViewController更改为UIViewController,并将TableView作为子视图。 现在,ViewModel符合TableViewDataSource协议。 NumberOfRowsInSection,cellForRowAt和numberOfSections是ViewModel的一部分。 这样可以将ViewController和ViewModel分开。 请在这里找到最终更新的项目。 感谢大家的贡献! 在第一部分中,我们创建了以下表格视图: 在本文中,我们将进行一些更改以使该部分可折叠:

每个iOS开发人员都应了解的iOS 12顶级功能

注意:这是原始访客博客的重新发布,我在 此处的 Bitbar博客上写道 在宣布推出三款新iPhone之后,苹果及时发布了iOS 12。 新的iOS版本在性能和用户体验方面具有丰富的功能,并在性能,安全性和隐私性方面进行了重大改进。 在为用户考虑这些新功能的同时,我们还需要考虑此版本对每个iOS开发人员和质量检查工程师的意义。 在这篇文章中,我们将探讨Apple新操作系统的一些主要开发和测试注意事项。 每个iOS开发人员都应了解以下新功能。 Xcode 10 新建系统 平行测试 xccov的代码覆盖率 创建ML Siri快捷方式 ARKit 2.0 CarPlay + Google Map 这些是iOS 12的一些特定于开发人员的关键功能。您准备好升级技术堆栈以支持这些iOS 12功能了吗? 正如我之前所说,这是我在Bitbar上的原始博客的转贴。 为了进一步了解面向开发人员和质量检查工程师的iOS 12功能,请在此处阅读Bitbar博客上的原始文章 让我知道是否错过了iOS 12的开发人员专用功能。 ======================================== 像XCBlog的XCTEQ发布的帖子一样? 您可能还会喜欢我们在 Github 上的一些开源项目, 或者在 Twitter 和 LinkedIn 上关注我们 XCTEQ 对于为Apple平台构建应用程序的公司 而言, 是生产力的提高。 让XCTEQ自动执行平台应用程序(iOS,macOS,tvOS)的构建,测试,发布,CI / CD管道,然后您专注于构建业务功能。 不要在错误的CI / CD和测试自动化工具上浪费时间和金钱,请接受专家的建议。 在 http://www.xcteq.co.uk上 查看XCTEQ产品和服务, 或通过info@xcteq.co.uk。给我们写信。

在iOS中将渐变颜色快速应用于文本

渐变颜色很酷,尤其是将它们应用于文本时。 当然,您可以打开Photoshop或Sketch,对文本应用渐变,导出为png等。在以后需要更改字体,文本,间距等时,这是非常有限的。让我们学习如何使它们全部发生码! 通过下载游乐场来遵循:https://github.com/kgellci/GradientColorsInSwift 创建带有渐变颜色的视图。 在将渐变颜色应用于视图时,CAGradientLayer是您的朋友。 现在是时候添加标签并为文本遮罩渐变了! 您当然可以使用情节提要和自动布局来设置视图和标签。 如果视图更改大小,则必须相应地更新渐变图层的大小。 这足以让您自己开始探索渐变。 通过遮盖imageView或UIButtons标题标签来尝试上述示例。 您还可以浏览Shift的源代码:https://github.com/kgellci/Shift Shift可让您通过定时动画或设备运动快速创建渐变(倾斜设备可移动渐变)。