预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIView https://developer.apple.com/reference/uikit/uiview 快乐编码😄
在Swift中优化构建时间是一个经常讨论的问题。 我找到了一篇很棒的文章 。 @泰勒·米尔纳 我注意到String插值的编译时间很长,因此我决定扩展这部分内容。 在上一篇文章中,我展示了String插值的执行时间。 现在,我将专注于构建时间。 但是如何检查编译花费了多少时间呢? 您可以轻松下载并运行特殊工具BuildTimeAnalyzer (但是,将需要干扰项目设置)或运行脚本(可以避免此问题) 添加插值字符串效率最低。 它比最快的String格式快70倍 。 您可以认为“ 只有19ms ” ,是19ms,但仍比最快的解决方案多70倍,而这仅仅是一行代码。 如果不止一个怎么办? 让我们检查一下! 我已将每行复制60次。 编译器已经猜到了如何处理第三个函数,但是现在最快和最慢之间的区别是280ms以上 。 我不得不承认,现在它的速度不是70倍,而是慢了24倍。 不要小看编译时间。 您可以低成本获得很多收益。 在某些情况下,仅更改几行代码即可将性能提高百分之几十。 感谢您的阅读! 如果您喜欢这篇文章,请鼓掌,以便其他人也可以阅读。 下一篇文章我也会有更多动力。🙂您还可以查看其他文章,也许您会找到适合您的东西。 如果您有任何问题或建议,请发表评论。
预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIApplication https://developer.apple.com/reference/uikit/uiapplication 快乐编码😄
预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIInterpolatingMotionEffect https://developer.apple.com/reference/uikit/uiinterpolatingmotioneffect UIMotionEffectGroup https://developer.apple.com/reference/uikit/uimotioneffectgroup 快乐编码😄
在 programmingwithswift.github.io上 查看我的其他帖子 UITableViews是iOS开发中最常用的视图之一。 大多数时候,您会想创建自定义UITableViewCells,因此在本教程中,我将向您展示如何创建自定义UITableViewCells。 在开始之前,我假设您已经有一个UITableView设置。 步骤1:建立新的Cocoa Touch类别 步骤2:设计单元 对于单元格设计,我将将高度设置为60,然后添加UITextField和UIButton。 稍后,我们将它们连接到UITableViewCell视图类。 将高度设置为60,请参见下图: 然后将UITextField和UIButton拖放到该视图中。 这就是我的风格。 下面是UITextField约束设置的图像: UIButton约束如下: 步骤3:向UITableView注册新的自定义UITableViewCell 注册新的自定义表格视图单元格。 在用于表视图的视图控制器中添加一个名为registerTableViewCells()的函数。 确保您有权访问表格视图。 您将需要使用tableview来注册新单元格。 您的函数应如下所示: 此代码正在注册一个新的自定义UITableViewCell。 在第一行中,我们创建一个新的UINib实例,第一个参数是nibName。 这必须是您创建的新单元格的名称,即文件名。 在第二行中,我们告诉UITableView我们要向其注册哪些新的自定义单元格,我们需要传递之前在该行中创建的UINib实例,然后需要为新单元格提供重用标识符。 在这种情况下,我只是使用文件名作为重用标识符,但是您可以根据需要提供任何名称。 步骤4:调用registerTableViewCells方法 为了调用上面创建的函数,我在viewDidLoad()函数中对其进行了调用。 我的viewDidLoad()函数如下所示: 步骤5:更新CellForRowAtIndexPath函数 为了使用新的单元格,您需要将以下代码添加到cellForRow委托方法中 只要确保使用您为类命名的名称和重用标识符来更新标识符和类名即可。 就是这样! 现在,您可以运行该应用程序,并且应该会在表格视图中看到自定义的UITableViewCell。 现在我们只需要在新单元格上连接UITextField和UIButton。 连接这些控件时,我们要做的只是打印您在文本字段中键入的文本。 步骤6:为UITextField和UIButton创建出口和功能 在此步骤中,您将需要创建您的商店。 我在下面提供了一张图像,该图像显示了我所做的事情。 完成创建网点后,您将需要创建一个新功能,如下图所示。 此函数将从文本字段获取值。 您现在应该可以运行该项目。 运行它时,应该显示一个自定义UITableViewCell。 您还应该能够在文本字段中键入一些内容,当您点击按钮时,它应该在Xcode的控制台中打印您在文本字段中键入的任何文本。
注意 :本文的灵感来自Audrey Tam的出色教程-raywenderlich.com上的“ URLSession教程:入门”。 她的教程基于一个入门项目,该项目已完成约60%,并且她将该项目用作启动板,以介绍URLSession的其他更深入的方面。 我的文章解释了填补0%到60%之间的差距所需的步骤。 这里的目的是增加以上教程中已经存在的内容,但绝不替代它。 但是,如果您了解基于NSURLSession的网络的基础知识,则可以继续阅读并将其视为独立的教程。 在开始之前,让我们看看我们要实现的目标。 在本文的结尾,我们将创建一个应用程序,该应用程序可以使用关键字搜索iTunes,显示结果,启动下载,根据需要暂停恢复下载并播放歌曲。 该应用程序的体系结构是MVC-N。 它具有模型,视图,控制器和网络层。 在Xcode中启动一个新项目。 选择“单视图应用”。 在下一个屏幕上,输入产品名称,选择团队,根据需要输入组织和组织标识符,选择语言为Swift。 在下一个屏幕中,选择项目的位置。 现在已经创建了项目,在“项目导航器”中进行分组。 创建四个组,分别是视图,模型,控制器,网络和支持文件。 选择“ ViewController.swift”到“ Controller”文件夹。 将Xcode随项目创建的其余文件移动到“支持的文件”中,Info.plist除外。 还要从编辑器窗格中选择“ ViewController.swift”,将其名称重构为“ SearchViewController.swift”。 完成后,您的“项目浏览器”应类似于以下内容: 在这里,我们需要选择“ Main.storyboard”,该文件通常为空。 拖放搜索栏并调整其尺寸,使其填充视图顶部。 然后,添加一个充满整个屏幕其余部分的tableView控制器。 将tableviewcell拖到tableView的顶部,它将用作原型单元。 完成后,情节提要将如下所示。 只需运行该应用程序,然后查看您的位置即可。 如果您看到与以下内容相似的商品,那就很好。 接下来,我们将为此应用程序设计原型单元。 我们有七个UI元素可用于此原型单元。 它们是曲目标题,艺术家标题,下载进度指示器,下载进度描述标签,下载按钮,取消按钮和恢复按钮。 根据需要调整原型单元的高度。 此时不要花时间建立完美的约束。 我们的重点必须放在放置项目并将它们连接到我们将很快创建的自定义UITableViewCell类文件上。 我已经对单元上的三个标签进行了基本的自定义,以在视觉上区分它们。 我将曲目标题字体类型设置为粗体,将艺术家标签字体颜色设置为灰色,将进度描述标签大小设置为10.0。 原型单元现在看起来像这样。 现在,我们已经准备好原型单元UI,让我们在“视图”下创建一个类来连接UI元素。 右键单击“视图”文件夹,选择“新文件”,在下一个屏幕上选择“可可接触类”,输入名称为“ TrackCell”,然后从下拉选项中选择“ UITableViewCell”。 选择要保存的位置。 添加新类后,将原型单元的类设置为TrackCell。 同样,我们需要为原型单元设置一个可重用的标识符。 是时候将原型元素作为IBOutlets连接到新创建的tableViewCell类了。 选择主板。 启用助手视图,以便您可以轻松地从情节提要中按住Ctrl +拖动,然后拖放到类文件中。 选择的元素名称为titleLabel,artistLabel,progressView,progressLabel,pauseButton,cancelButton和downloadButton。 […]
你好 这周因为疑似诺罗病毒的肠胃炎,所以不能去上最喜爱的彼得潘的课,只好在家自己试着写看看作业,不写还好,一写就发现… 之前自学的都快忘光啦~~~ 花了点时间熟悉了语法,同时也翻了翻笔记唤起回忆,幸好最后有顺利解题成功,不过我还是有点忘记tuple的用法,接下来寻找机会再弄熟点。 (贴上原始码之后才发现,为什么tab在Medium上面显示不出来呢~~) //以下代码用于作业。 // homework1 var sum:Int = 0 var tempSum:Int 对于x in 1…7 { 对于1到7的y { tempSum = x * y 总和= tempSum } } 打印(“所有单元格的总和是\(sum)”) // homework2 让numArray = [1、3、5、7] var sum2:Int = 0 var tempSum2:Int 对于numArray中的x 对于1到7的y { tempSum2 = x * y sum2 + = tempSum2 } } […]
文件专用 访问将实体的使用限制为自己定义的源文件。 当在整个文件中使用特定功能的实现细节时,使用文件专用访问权限可以隐藏这些细节。 专用 访问将实体的使用限制为封闭的声明以及该声明在同一文件中的扩展名。 当仅在单个声明中使用特定细节的实现细节时,使用私有访问权限可以隐藏这些细节。 私人的 仅在类及其扩展名中具有私有访问权限(当扩展名位于同一.swift文件中时)。 私人档案 仅在类及其扩展名和子类中提供文件专用访问(当扩展名或子类位于同一.swift文件中时)。 + 同一文件中的子类。 让我们创建一个示例。 我们有3个Controllers类,分别为ViewController,DetailViewController和ScreenViewController。 现在,在ViewController中声明了2个属性,带有private的 testCount和带有fileprivate的newCount。 我们可以在上面的代码中看到。 由于访问控制fileprivate,我们无法访问ScreenViewController中的newCount。 现在,仅在ViewController文件中声明newCount。 如我们所见,由于在同一文件中声明了newCount,因此可以在ScreenViewController中访问它。 现在让我们对testCount做同样的事情。 正如我们在屏幕快照中看到的那样,我们也无法在同一文件中访问testCount。 而我们可以在扩展类UITextFieldDelegate中访问newCount和testCount。 结论:Private和FilePrivate都不能在声明它们的文件外部访问。 唯一的区别是FilePrivate变量可在子类和扩展名中访问,而Private只能在扩展名中访问,而在子类中不可访问。
自定义UITableViewCell可以允许使用功能强大,动态且响应迅速的界面。 通过广泛的自定义并结合其他技术,您可以执行以下操作:更改特定的属性或界面元素,以便在单元中进行更改或设置动画或绘制图素;在用户滚动浏览时有效地加载视频,甚至从用户下载时显示图片网络。 这里的可能性几乎是无限的。 以下是自定义单元格的简单示例: 在包含tableView的UIViewController中,注册新的自定义单元格的类(请参见下文)。 请注意,仅当您未在表视图的界面中设计带有情节提要的单元格时,才有必要。 迅速 覆盖func viewDidLoad(){ super.viewDidLoad() //注册单元格类 tableView.register(CustomTableViewCell.self,forCellReuseIdentifier: CustomTableViewCell.identifier) } 如果您选择使用XIB文件,请改为registerNib //注册笔尖 tableView.register(UINib(nibName:CustomTableViewCell.identifier,bundle:nil), forCellReuseIdentifier:CustomTableViewCell.identifier) 现在您的tableView知道了您的自定义单元,您可以在cellForRowAtIndexPath中将其出队: 迅速 func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell { //加载CustomTableViewCell。 确保此处提供的标识符与您的单元格中的标识符匹配 让单元格:CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier(CustomTableViewCell.identifier)为! CustomTableViewCell //这就是神奇的地方-在自己的单元格上设置自定义属性 cell.customLabel.text =“我的自定义单元” 返回单元 }
单元测试提供了一段代码必须满足的严格的书面合同。 结果,它提供了几个好处。 单元测试会在开发周期的早期发现问题。 理想情况下,每个测试用例都相互独立。 单元测试通常由软件开发人员编写和运行,以确保代码符合其设计并按预期运行。 单元测试的好处 使流程敏捷 当您敏捷开发产品时,更改是您需要牢记的最重要的事情之一。 当您的应用程序功能不断增长时,更改已经测试的代码非常危险且成本很高。 但是,如果我们在正确的位置进行了测试,则可以放心地进行重构。 单元测试确实与各种口味的敏捷编程紧密结合,因为它内置测试,使您可以更轻松地进行更改。 换句话说,单元测试有助于安全重构。 2.代码质量 单元测试可以提高代码的质量。 它确定在进一步发送代码进行集成测试之前可能出现的每个缺陷。 在实际编码之前编写测试会使您对问题的思考更加艰辛。 它暴露了极端情况,使您可以编写更好的代码。 3.尽早发现软件错误 由于单元测试由在集成之前测试单个代码的开发人员执行,因此可以很早地发现问题,然后就可以解决问题,而不会影响其他代码。 4.促进变更并简化集成 单元测试允许程序员在以后重构代码或升级系统库,并确保该模块仍然正常工作。 单元测试检测可能会违反设计合同的更改。 它们有助于维护和更改代码。 单元测试可减少新开发功能的缺陷或减少更改现有功能时的错误。 5.提供文件 单元测试提供了应用程序的实时文档。 希望了解特定单元提供什么功能的开发人员可以参考单元测试以了解该单元的应用程序编程接口(API)。 API根据输入,输出和基础类型指定组件。 6.调试过程 单元测试有助于简化调试过程。 如果测试失败,则仅需要调试代码中最新的更改。 7.降低成本 试想一下,在开发的后期阶段(例如在系统测试或验收测试期间)发现错误的代价。 当然,较早发现的错误更容易修复,因为较晚发现的错误通常是许多更改的结果,并且您真的不知道是哪个原因导致了该错误。