Tag: swift

使用Swift在iOS上进行单元测试Model View Controller

Swift Single App View项目设置 因此,这很简单,只需打开Xcode,单击“创建新的Xcode项目”,选择“ iOS”和“ Single View App”。 然后单击“下一步”。 我将我的项目命名为“ Account”,但是您可以随便调用它。 从下拉框中选择适当的团队。 然后,取消选中“包括UI测试”和“使用核心数据”。 我们对单元测试感兴趣,因此请选中“包括单元测试” 。 然后,单击“下一步”。 至此,我们有了可以开始构建的样板代码。 让我们花点时间注意Xcode为我们创建的所有文件。 其中包括AppDelegate,主故事板,“帐户组”文件夹下的ViewController和具有一些样板单元测试用例的AccountTests文件。 我们的ViewController具有以下代码: 我们已经完成了在应用程序中实现整个MVC模式的工作,并为此编写了单元测试。 最后,我希望您在尝试开发MVC应用程序时记住以下几条原则 使用协议在控制器中建模和查看 对模型和视图使用合成而不是继承。 对控制器的模型和视图使用依赖注入 。 并始终尽早编写单元测试用例 。 希望本文能有所帮助,因为这是我的第一篇有关媒体的文章,请让我知道我的工作方式。 我在Orthogonal工作,我们根据监管准则和标准为客户开发医疗应用程序。 由于这些应用程序与健康相关,因此我们遇到了非常新颖和前沿的概念,这些概念处于AI,IoT和医学的交汇处,我们与客户合作进一步发展。 听起来很有趣? 我们一直在寻找有才能的人。 在https://orthogonal.io上查看我们

适用于iOS开发人员的SOLID原则

接受原则,而不是架构 这些原则一起使用时,旨在使程序员更有可能创建易于维护和随时间扩展的系统。 SOLID Principles是用于以适当方式开发软件以避免错误设计的编码标准。 它是由Robert C Martin推广的,并在面向对象的设计范围内使用。 如果正确应用,它将使您的代码更具可扩展性,可维护性,逻辑性和可读性。 SOLID原理中的原理是什么? SOLID原则不是规则,不是法律,也不是完美的真理。 这是对良好的软件设计的建议,该软件设计既不严格也不脆弱。 对原理和模式的了解使您有理由决定何时何地应用它们。 如果您不了解它们,那么您的决定就会更加武断。 SOLID是五项设计原则的首字母缩写,旨在使软件设计更加易懂,灵活和可维护。 SOLID原理是Martin在2000年提出的。 在阅读有关原理时,您将遇到两个术语“刚性”和“脆弱性”。 让我们讨论一下它们是什么: 刚性:当更改导致相关模块中其他无关的更改时,软件变得难以更改。 简单的更改变得昂贵。 硬代码是具有依赖性的代码,这些依赖性会在很多方向上产生作用,以至于您无法进行孤立的更改而不更改其周围的所有其他内容。 —罗伯特·马丁 例如,您尝试更改数据层中的一些底层细节,突然之间,在为您的View进行格式化的类中遇到了编译错误。 如果您经常发现自己几乎触及了项目的所有文件,那么只要您在单个类中进行更改,就会出现僵化代码的症状。 易碎性:易碎代码比敏捷代码更糟糕,因为它不会产生编译时错误。 修复程序引入了会导致回归问题的新错误。 易碎的代码以您无法预测的奇怪方式中断。 —罗伯特·马丁 这里解释原理的内容太多了。 我将为这些原则提供专门的职位。 S —单一责任原则 O —打开/关闭原理 L-Liskov替代原理 I —接口隔离原理 D —依赖反转原理 感谢您阅读文章。 您可以在以下位置找到我: Linkedin: Aaina Jain 推特: __aainajain

iOS中的GIF终极指南。

动画内容的另一面。 GIF大约在1980年代后期。 只是在最近,它们才被虚拟吹灭。 从博客到meme网站,您可以在任何地方看到它们。 在图片上使用GIF的原因很多,例如,它们通常不像视频那样沉重,可以恰当地显示您的观点并且可以在任何地方兼容。 如果一张图片可以说一千个单词,请想象一个GIF可以有多少个。 存在对在iOS中播放GIF的本机支持,但乏味。 您需要使用Apple的ImageIO框架加载GIF的每个图像,并自定义theAnimatedImages , animationDuration和animationRepeatCount API。 Flipboard实现了一种在其应用程序内播放GIF的解决方案。 我们将使用他们的图书馆,名为 FLAnimatedImage在我们漂亮的小应用程序中复制相同内容。 按着这些次序: 安装Cocoapods。 如果尚未安装,请按照此处的步骤操作。 创建一个新的Xcode项目。 我将其命名为GIFTest。 FLAnimatedImage有一个cocoapod可用。 如果您不知道什么是Cocoapods或它如何工作,请查看此链接。 3.现在,打开终端。 将目录更改为保存iOS项目的位置。 通过键入pod init初始化我们项目的Cocoapods。 接下来,通过键入open podfile 。 我们将添加吊舱。 添加线pod ‘FLAnimatedImage’ 4.现在,我们将进行pod install以将pod install到我们的项目中。 我们将关闭Xcode的所有会话并打开GIFTest.xcworkspace项目。 那是带有白色图标的Xcode项目。 xcworkspace项目有我们的原始项目,还有一个带有pod的xcode项目。 5.太好了! 完成所有设置后,我们将三个UIImageViews添加到我们的项目中。 我们将其类更改为FLAnimatedView。 6.导入FLAnimatedImageView并为所有三个图像创建出口。 7.现在,我们将在本地加载两个GIF,并从互联网加载一个GIF。 要在本地加载GIF,请将它们移到您的项目中,然后选中“如果需要,复制项目”。 8.现在要在本地加载GIF,请按照以下步骤操作。 因此,只要提供了GIF,就将帧解压缩为位图格式(CPU密集型),并将其填充到缓存中。 编码的位图将一直保留到对象的生存期。 它试图有效地选择缓存大小,即,如果GIF太小,它将帧保留在缓存中,否则,它仅缓冲足够的帧以进行实时回放。 当系统发出内存警告时,所有帧都将丢失,并且过程将退回到按需解码。 因此,今天,我们学习了如何使用Cocoapods,如何在项目中对其进行初始化,安装了Flipboard的开源库FLAnimatedImage并将其用于显示项目内的GIF和来自互联网的GIF。 有关更多参考,请在此处查看库。 有关完整的源代码,请参阅 我的Github存储库。 如有任何问题和建议,请在下面发表评论!

如何在IOS App中监视网络请求

在这篇文章中,让我们看看如何在IOS swift应用程序中监视和调试网络请求。 在此演示中,使用了Swift 4.1。 让我们从创建一个新的IOS swift项目开始。 现在,打开Storyboard并创建一个新按钮,然后通过创建一个动作函数将其连接到ViewController。 现在,我们创建一个名为requestData()的方法,在其中编写所有网络代码。 让我们使用session.dataTask() 现在让我们创建一个URL。 转到Intercept.rest并创建一个新的Intercept帐户。 通过提供端点URL作为所需的API URL来创建新的拦截器,然后单击“ 创建”按钮。 现在,复制已生成的新URL 。 现在打开代码,并将新生成的URL粘贴为常量URL的值,然后运行该应用程序。 按下我们创建的按钮,同时检查拦截器仪表板。 现在,您可以监视所有网络请求。 按下“扩展”按钮以查看完整的JSON响应。 Intercept.rest使您可以调试和监视API请求和响应。 它类似于Chrome开发者工具中的“网络”标签,但适用于任何API:移动应用,网络挂钩,前端等。

带有固定页脚UIButton的TableView中的多个单元格类型

带有固定页脚UIButton的TableView中的多个单元格类型 此案例终于实作成功啰!为了感谢社群的温暖力量,我分享我自己实作后遇到的困难点,希望也能帮助其他跟我一样遇到困难的朋友们。 画面需求: 1.有五种搜寻items的方式,两个栏位是透过api回传可选的选项,两个栏位是跳出日期选择,一种栏位是输入编号,共有五种(分四个部分)。 2.使用者点击文本字段之后,会跳出pickerView压在tableView上面 3.有一个修复页脚按钮作用是送出筛选条件的提交按钮 根据图片所示的需求,我苦恼很久,在通过各位好心的大大给的各种建议,我决定先采用tableView搭配类似的单元格类型去实作里面的内容。虽然有其他大大推荐的滚动视图,也是很不错的方案,但我暂时无法自己应付自动布局,会花比较多的时间。tableView的好处是可以帮我处理自动布局。 困难1。 在实作的过程中,遇到比较难的问题在于,我要的是触发里面的文本字段,而不是触发cell,所以我必须要禁用(取消)cell的触发事件功能,然后使用addTarget这个方法去触发功能,再透过功能的发件人获得我为文本字段设置的标签编号去攫取文本字段的值。 注意:可是我还是无法达到不要让textfield可以输入字,但依然触发tag event 演示: func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch indexPath.section { case 0: let cell = tableView.dequeueReusableCell(withIdentifier: “dateCell”)! as! SearchByDateCell cell.dataTest.tag = 11 cell.dataTest.addTarget(self, action: #selector(OrderViewController.selectAction), for: UIControlEvents.editingDidBegin) Return cell default: // code here return cell } } 困难2。 选择器视图与表视图的实作函数在同一个视图控制器类中,感觉非常杂,只好使用备注,和排放整齐来让程序码更易读。另外的选择器视图要压在表视图这个地方不是穿透IB或纯代码一开始实作很不适应,因为不了解UIView之前的层次优先问题,导致选择器视图一直出不来。以下是成功的实际选择器视图压在表视图的功能代码 func […]

SWIFT 3中的UICOLLECTIONVIEW,没有界面构建器。

集合视图类似于表视图,它们显示由自定义布局定义的单元格的集合,并且像表视图一样,它们必须符合协议才能显示数据和执行操作。 在本教程中,我们将创建一个看起来像网格的集合视图。 好吧,让我们潜入…… 让我们开始创建一个新项目,这次选择Swift。 现在,让我开始向您介绍将处理collectionView布局的类UICollectionViewFlowLayout。 创建一个新的Cocoa Touch文件并使其成为UICollectionViewFlowLayout的子类,添加此完整的实现,我将对其进行解释…… let innerSpace: CGFloat = 1.0 let numberOfCellsOnRow: CGFloat = 3 override init() { super.init() self.minimumLineSpacing = innerSpace self.minimumInteritemSpacing = innerSpace self.scrollDirection = .vertical } required init?(coder aDecoder: NSCoder) { //fatalError(“init(coder:) has not been implemented”) super.init(coder: aDecoder) } func itemWidth() -> CGFloat { return (collectionView!.frame.size.width/self.numberOfCellsOnRow)-self.innerSpace } override var itemSize: […]

Apple Watch —并发症

Neste artigovocêirácompreender melhor o queéuma并发症,可随时用于实施uma。 Oéuma并发症? Apple Watch的复杂功能和可视化的相关信息,包括Apple Watch的相关应用程序,Apple Watch的相关信息,iOS应用程序的功能,功能和功能。 作为复杂并发症的重要信息,请参见家庭并发症的不同处理。 不同的布局,不同的形式,不同的表观,复杂的表壳,复杂的外观,以及各种形式。 由复杂性引起的动机和复杂性方面的问题,作为手表表盘的人可以将其保留下来。 苹果官方文件将其作为复杂性的家族成员: 圆 模块化小 模块化大 实用小 大型公用事业 超大 一位名叫圣玛利亚·拉多斯·阿尔冈斯的复杂事例,面目全非,Apple的文献资料 科莫funciona? Antes de tudo,重要的军刀并发症功能。 基本配置文件,可配置的uma并发症,最确定的时刻。 举例来说:想象一下,您将因复杂而复杂化,并因应自己的状态,并最终获得身份证明:没有任何权利,也没有权利。 时间轴的可视性和时间信息。 Ela pode ser utiliza para mostrar dados futuros ou dados passados。 时间轴的时间限制,时间轴的时间限制。 官方文件示例: 动手 Agora quevocêjásabe o queé和e que que ma并发症,迷走神经。 在马尼拉,您可以轻松实现以下目的: 在操作系统中使用“包括复杂性”的首字母缩略词,以了解其在以下方面的重要性: 可以使用ComplicationController.swift控件作为数据源和数据源的功能,在本地不等于时间轴的配置。 WatchKit扩展:在目标和目标之间进行选择: 一般情况下,将复杂配置作为运维,将“大型模块化”马尔代夫(ixsero apenas)称为“复杂”。 […]

策略模式

策略模式是模板模式的扩展。 我们使用这种模式是为了避免如果我们将模板继承模式带到其逻辑结论时将需要重复: 对于策略模式,我们遵循依赖注入的原理。 我们从每日报告的测试文件开始: 然后,我们继续文件本身: 注意,write_report方法现在如何仅引用格式化程序实例变量。 现在可以使用HTMLFormatter或CSVFormatter实例化WriteReport类。 然后,我们编写HTMLFormatter测试: 继续模拟我们要创建的html文件: 然后,我们创建文件本身: 我们的下一个挑战是创建CSVFormatter,我们从CSVFormatter规范开始: 我们还检查CSV文件中的条目: 最后,我们创建CSVFormatter模块: 我们检查所有测试是否通过: 到了! 策略模式:较小规模模板模式的可扩展改进。

Swift,C,LLVM编译器优化

用很少和基本的词来说,LLVM是一个编译器框架,在“前端”-“后端”多层体系结构中支持许多不同的编程语言,其中,第一层非常容易地对源代码进行解析和分类,以生成中间语言表示形式,第二层层将中间表示形式转换为针对不同处理器体系结构优化的实际组装机器代码。 当然,LLVM比这个简单的描述要多得多,但是我并不十分在意这篇文章中的LLVM。 我在这里真正关心的是专注于基于LLVM架构的Swift和Clang现代编译器如何进行编译,尤其是优化我们开发人员每天生成的源代码,尤其是这些编译器如何对某些旧式技巧,窍门做出反应和优化,我们尝试在源代码中花费一些时间。 在这篇文章中,我将测试一个在Swift和C中使用不同编程技术实现的超简单但繁琐的函数,以试图迫使编译器遵循一些经典的优化模式。 我将提供编译后代码的运行时执行性能结果,并分享生成的汇编代码中的一些优化细节。 假设您已经分配了一个很大的缓冲区,不管是在堆还是在堆栈上,我们都不在乎,我们可以很容易地说一个整数数组,我们的基本函数只需要为该数组的每个位置分配一个特定的值。 而已! 因此,在C语言中,我们的功能可能是这样的超级基本的东西: void testLoop(int64_t * buffer,int64_t tot){ for(int64_t i = 0; i <tot; i ++){ *缓冲区++ = 1; } } 在Swift中,类似的东西非常类似: func testLoop(_ a:inout [Int],_ tot:Int){ 对于i in 0 .. <tot { a [i] = 1 } } 注意,我在这里使用64位整数,因为这是64位体系结构上Swift Int的默认值,我希望能够支持很大的缓冲区以及巨大的循环。 一个好的开发人员通常可以在这种超级简单的场景中应用的基本技巧之一就是试图减少循环指令占用空间的影响。 举例来说,除了让循环具有n个交互并在每个循环交互上没有一条赋值指令,我们还可以将总的循环交互减少一个数量级,并在循环周期内放入10个这样的嵌套指令, 在C中: void testLoop(int64_t * buffer,int64_t tot){ int64_t […]

具有纹理的模型视图意图

ASRenderModelProtocol和ASRenderModelIdentifier是用于在ASModelSyncronizer上标识模型的便捷ID对象和协议。 ASModelSyncronizer是基于模型唯一标识符的模型管理器。 它与线程安全性在后台调度程序上并发工作 您可以在基本模型对象上继承ASRenderModelProtocol 你应该做一些这样的业务逻辑 我说过我的目标是,必须在Node初始化完成之前初始化所有子节点属性。 GeekTree0101 / RxMVVM-纹理 RxMVVM纹理– RxSwift MVVM模式最佳实践,建立在Texture(AsyncDisplayKit)上,并用Swift编写 github.com 在大型仓库中,您可以看到alll子节点是异步初始化的。 即使在超级节点完成其初始化之后,所有子节点也不知道其属性值已被自己初始化。 首先,意图将使用模型初始化 接下来,意图应该与业务逻辑一起订阅(突变关闭) 变异是业务逻辑的封闭 update(to :)是更新目标视图属性,表示输出 interact(from :)表示输入 如果需要在绑定值之后更新布局。 然后在update(to 🙂 setNeedsLayout参数上插入更新目标节点。 您可以从上图看到在节点初始化之前初始化的所有子节点属性都已完成。 用户将触摸个人资料图片。 届时,个人资料视图将发出点击事件 配置文件点击事件将调用从后端服务下载图像 3. ASModelSyncronizer将使用业务逻辑自动更新所有已识别的用户模型。 [1〜2]用户交互>发出>目的 [2〜3]意图>后端服务 [3〜4]后端服务>更新模型的突变关闭 [4〜5]变异>模型更新 [5〜6]模型>突变关闭以进行更新视图 GeekTree0101 / Rx可可纹理 RxCocoa纹理– RxCocoa纹理扩展库。 github.com