Tag: swift

使用Xcode中的新构建系统加快构建时间

作为iOS工程师,您可能白天要按CMD + B或CMD + R数百次,并且长时间观看Xcode编译这些内容。 当前,Xcode默认使用“标准构建系统”,这在编译Swift项目时有点慢。 为了改善Swift项目的编译和构建时间,苹果推出了这种全新的“新构建系统”,有望在性能和依赖管理等领域取得进步。 新的构建系统应该能够 提供更高的可靠性 捕获项目配置错误 提高整体构建性能 您可能有Xcode项目或项目的Xcode工作区,在Xcode中, 选择File-> Project / Workspace Setting。 您将看到一个“构建系统”选项以选择新的构建系统,如下所示 启用后,您应该会看到蓝色的锤子。 如果您使用“(xcodebuild)”从命令行构建iOS项目,那么我们必须传递附加参数-UseNewBuildSystem = YES还将强制使用新的构建系统。 启用“新构建系统”后,在工作区或项目设置中看到的唯一更改是 BuildSystemType 最新 它只是将一个键添加到项目设置中,仅此而已。 新系统不会对构建设置进行任何更改,也不会建议您进行任何更改。 这意味着无需学习新的构建设置,就可以轻松地迁移到新的构建系统。 我们获得了据说更快,全新且现代化的构建系统的好处,而无需更改构建设置。 您可以在此Blog中阅读有关新构建系统的更多信息。 注1: 对于最近在Xcode 9中创建的新项目,它工作正常。 但也许不适用于较旧的项目 错误:无法建立节点: 解: 在“复制捆绑资源”阶段搜索.plist文件,那里不应该有任何plist文件,在我的情况下,这阻止了新的构建系统的构建。

如何在Xcode中轻松找到未使用的Swift代码

保持理智,并使用此ruby脚本轻松删除Xcode中未使用的代码。 将脚本添加到项目主文件夹中名为ruby.rb的ruby文件中。 您可以使用以下命令在终端中运行代码: $ ruby​​未使用.rb 终端将显示项目中未使用的函数和变量的列表。 如果您希望在Xcode中轻松显示它,请导航到“ 构建阶段”下的项目运行脚本。 添加以下shell脚本以自动运行未使用的脚本: file =“ unused.rb”如果[-f“ $ file”] thenecho“ $ file找到。”红宝石未使用。rbxcodeelseecho“ unused.rb不存在” fi 之后运行您的项目,未使用的代码警告应在“构建时间警告”窗格中可见。 请记住,此代码将有很多误报(协议,函数和系统委托)和误报,因此在删除任何“未使用”的委托方法(例如collectionView的numberOfSectionsInCollectionView)时要小心。 如果您不想用此脚本警告输出来打扰同事,请将未使用的.rb文件添加到您的项目.gitignore中 (上面的run脚本在运行之前检查其存在) 。 如果该脚本不适合您,请查看Ian Leitch的Periphery App。 感谢Paul Taykalo的真正有用的脚本。 跟我来了解有关Xcode,Swift和iOS开发的更多提示 如何在Xcode中调试SceneKit和ARKit SceneKit是我最喜欢的Apple iOS框架之一。 它允许各个级别的开发人员创建3D… medium.com

不要引入副作用

最好的情况是,单元测试是一种有用的诊断工具,可帮助您了解应用程序的哪些部分正常工作,哪些无效 。 单元测试可帮助您找到回归 ,由于最近的一些代码更改,这些功能不再起作用。 有了完善的测试套件,您可以精确地确定哪些代码行导致了最近的回归,并且可以对其进行修复。 但是,在最坏的情况下,单元测试带来的混乱比清除起来要多。 您可能不知道哪些测试真正通过了,因此,您可能不再认为值得再运行这些测试了。 到那时,测试花费的时间超过了您节省的时间。 发生这种情况的一种常见方式是单元测试产生副作用时。 在本文中,您将探索如何发生这种情况以及如何避免这种情况。 什么是副作用? 副作用是由于运行测试而导致的一些长期后果 。 副作用可能影响应用程序本身,测试套件的安装,或者在更极端的情况下,影响应用程序所依赖的服务器环境。 在大多数情况下,副作用只会造成混乱。 由于副作用似乎是随机的,因此您最终可能会创建难以跟踪和重现的错误 。 这可能使您陷入一些奇怪的兔子洞,从而调查与应用程序逻辑无关的问题。 让我们研究一下测试可以产生副作用的方式。 本地存储的副作用 单元测试绝不应向文件系统写入任何内容 。 如果这样做,它们可能会影响您的应用安装所依赖的存储状态。 当这种情况发生时,这不是世界末日。 这不是那种会影响客户电话(基本上是从App Store下载它的人)在生产中使用该应用程序的事情。 话虽如此,它可能会导致测试设备上出现一些奇怪的错误。 让我们再来看上一篇文章中的AccessGranter类,不要依赖临时状态。 在该文章中, AccessGranter授予访问应用程序中功能的权限,但前提是用户已登录。该类的第一个版本直接由用户默认值确定。 这是从该文章复制的相同代码。 即使您不是api开发人员,Postman还是一个不错的工具。 您可以实时了解api团队的进展情况。 我过去常常将所有时间都花在编写会访问api团队正在研究的不同端点的代码上。 为了测试这些端点是否正常工作,我将手动运行该应用程序。 邮差通过为我完成所有这些工作来节省时间。 在将应用程序连接到服务器之前,我可以快速检查Postman。 如果连接处于活动状态,并且请求返回了预期的数据,那么就可以开始了! 下一步是什么? 具有较小的全局可变状态的副作用是较少的副作用 。 当编写更好的代码时,最终会编写出更有效的测试。 当您专注于编写更有效的测试时,您会编写更好的代码。 这就是单元测试可以使您成为更好的开发人员的方式。 我目前正在写有关iOS单元测试的书。 下一篇文章将重点介绍编写快速的单元测试。 同时,您可以查看有关单元测试的其他工作。 不要依赖临时状态 构建iOS单元测试的四个简单规则 我们应该在iOS应用程序中进行哪些单元测试?

持续学习曲线(2018年4月)

周日4月1日 调试能源问题 编写节能应用 4月2日,星期一 一种简单的特性,可以提高您的软件职业 我刚刚在Facebook获得开发人员职位。 这是我准备面试的方式。 星期日四月8 为iPhone X设计 为iPhone X构建应用程序 4月12日,星期四 我如何找到六个图的远程软件开发人员职位 设计具有超宽屏幕和刻痕的UI 这些简单的步骤使您的iOS应用程序易于阅读。 React Native:我的本地开发人员第一印象 结束辩论:用于iOS应用程序开发的MVC,MVP和MVVM 4月13日星期五 维权工程 从2017年Swift顶级文章中学习iOS编程 在iOS中处理复杂的表格视图并保持理智 星期日四月15 作为远程开发人员一年 4月16日星期一 Swift中的设计模式:第一部分-创新设计模式 蓝帽 在iOS上平滑徒手画图 4月17日,星期二 开发人员和工程师之间有什么区别? 通用UIViewControllers 从iOS导航栏创建下拉菜单 清理表查看代码 尝试! Swift Tokyo 2018 —了解响应者链 4月18日星期三 开发人员的自然语言 4月23日星期一 为什么不应该将@IBActions didTapButton命名 实用的iOS开发:MVA方法 停止使用情节提要,以编程方式开始构建UI 100% 这些简单的步骤使您的iOS应用程序易于阅读。 4月24日,星期二 如何准备在Facebook进行技术面试 Swift中的功能重构 压缩(_:_:) 在单元中托管视图控制器 如何在iOS应用中使用协调器模式 Swift中的观察者—第一部分 […]

迅捷代码段#11-RawRepresentable

2017年3月20日,星期一 您可以在这里找到其要点! 上面的代码片段 在每个 RawValue 为 Int 枚举上 创建了 items & itemsCount 属性 。 枚举城市:Int { 案例德里 案例班加罗尔 孟买 } 在以上代码段的帮助下,要获取整个案例列表,我们可以执行 City.items 或 City.itemsCount 来获取计数 🚀 自Swift问世以来,我们所有人最近在我们的应用程序中都使用了Enums ! 而为什么不呢,它们却又超酷又强大。 但是它们有很大的局限性,在这里我们明确需要提供一个computed var得出的computed var来列出所有项甚至项数, 喜欢: 扩展城市{ 静态var项目:[城市] { 返回[.delhi,.bangalore,.mumbai] } 静态var itemsCount:int { 返回items.count } } 上面的代码没什么错,但是它并不出色😓每次添加新案例时,我们都必须更新items ,否则可能会导致bug🐛没有人喜欢它们,我们如何对其进行自动化以使其正常工作盒子和上面的片段😄 非常感谢Nate Cook使其更加出色!!! 🛠️有两个限制 : 仅适用于 RawValue 为 Int 枚举 […]

为什么我只切换到程序化视图-iOS Swift开发

经典辩论-故事板与程序视图 因此,如果您是iOS开发人员或曾经做过iOS开发,那么您将知道其中最大的争论之一。 故事板与程序化视图。 尽管我认为只要您的应用程序具有出色的用户体验并没有关系,但是我最近决定只使用程序化视图。 切换之前: 在决定切换之前,我将情节提要用于基本的UI组件和开始的布局,然后我将以编程方式添加视图的更复杂方面。 故事板超级简单,简单而且非常基础,即使对于初学者来说也是如此。 但是,如果您不使用多个情节提要文件并合并XIB文件,则对于复杂的视图和大型应用程序,它们将变得非常混乱且缓慢。 尽管所有这些都很好,但我认为随着我在iOS开发方面的经验越来越接近更高级的范围,我希望将自己的技能提升到一个新的水平。 另外,随着我​​的客户应用程序的规模和复杂性的增长,出于以下几种其他原因,我决定仅切换到程序化视图。 为什么切换: 所有这些都是我的观点,您应该尝试所有概念和实践,以找出最适合您和您的团队的* 速度-在编译和运行代码时为我开发编程视图要快得多,在开发复杂的视图和自动布局时也是如此。 如果您曾经使用情节提要进行自动布局,那么您就会知道它简直糟透了。 但是,通过自动布局并向表视图添加复杂的模态,弹出窗口,动画和自定义功能,编程视图对我来说要快得多。 精度-我对程序化视图的精度和增强的控制使我的布局过程更加流畅和轻松,尤其是使用设计师的像素完美设计时。 合并冲突-坦白地说,您在团队中可以发生的故事板合并冲突的数量实在是太疯狂了。 现在,我要说的是,只要遵循某些规则,就可以避免它们全部使用,但是,我讨厌它们了! 自我-这纯粹是个人的,我只是使用程序化视图而感到凉爽,老实说,这是我很长时间以来一直在做的事情。 另外,我觉得我现在处于一定的技能水平,在这里,我仅使用程序化视图并继续以其他方式提升技能就变得很有意义。 你应该换吗? 这完全取决于您,我觉得一旦您成为一名高级开发人员,您肯定应该合并程序化视图。 但是,当您刚开始时,没关系。 选择一些东西,该死的好! 如果您要切换以确保在对个人或客户端应用程序进行更改之前先在操场上和其他小型应用程序中进行一些练习,那么您不想在生产就绪型应用程序上浪费时间进行诸如此类的更改时,以前做过。 结论:程序化是更好的IMO 基本上,我对切换感到非常满意,但我希望很久以前就可以完全通过编程实现。 我浪费了太多时间,我再也回不了情节提要了 但是,这并不意味着您必须切换或什至需要切换,这取决于您的偏好,团队,开发人员的目标和当前技能。 如果您打算进行切换,那么这里是一些入门的好地方,这些资源供使用编程视图的资深开发人员使用: Brian Voong-构建该应用程序 马克斯·纳尔逊(Max Nelson)-Udemy课程 我希望本文能对您有所帮助,无论您是否意识到编程视图是否适合您。 但最重要的是,我希望它可以帮助您认识到只要您的应用程序具有糟糕的用户体验,您所做的一切都无关紧要!

改善您的自动版式游戏。

它是如何工作的? 为了使自动版式的性能更好,我们首先需要了解其在引擎盖下的工作方式。 当您指定约束时,它们将传递到布局引擎,然后由布局引擎计算视图的适当大小和位置属性。 关系越复杂,计算所需的时间就越多。 但是稍后会更多。 在那之后,引擎告诉系统在屏幕更新后要考虑新的布局约束。 1.约束阶段从层次结构中最接近的视图到最远的视图(例如,从叶子到根)按顺序计算布局。 2.布局阶段调用方法的顺序相反。 在该阶段,所有视图均根据约束条件进行适当布局,并设置框架。 3.最后一个领域是更新屏幕。 自动布局问题。 1.多次创建约束。 如今,这是最不常见的错误。 过去,程序员倾向于在updateConstraints方法中创建约束,这会导致引擎每帧再次重新计算约束。 解: 设置视图内容后立即将布局代码置于视图初始化中的常见位置,或者在需要时创建一个标志以在updateConstraints方法中使用。 解: 上) 如果视图的约束与视图的直接同级和祖先相关,则引擎可以执行线性时间复杂度的计算,如下所示。 3.不必要的限制 当您有一些当前在屏幕上不可见的视图时,您无需关心它们的布局,因此我们可以减轻布局引擎的障碍。 解: 最有效的方法是将视图属性isHidden设置为true并停用约束。 我将使用不同的框架设置这种简单的布局,以演示语法和逻辑。 视觉格式语言 NSLayoutConstraint类 布局锚 解: 您可以使用第三方DSL(用于自动布局的包装器)扩展自动布局,对我而言,它们比Apple提供的更好。 SnapKit 品纳 制图学 5.难以调试 一直很难确定约束出了什么问题,尤其是在布局复杂的情况下。 现在,由于调试器变得非常聪明,它会变得容易得多,它会告诉您是否有问题。 而且,如果您使用情节提要板,则会出现警告,以防止您放置多余的/冲突的约束。 不是解决方案,而是提示: 您可以将SymbolicBreakpoint与UIViewAlertForUnsatisfiableConstraints符号一起添加。 它将使用汇编代码停止执行,您可以在其中转储通过在控制台po $rbx打印而破坏的视图和约束数组,或使用po $r14获取更多信息。 如果要查看有关所有子视图和特定视图约束的信息,请使用po .recursiveDescription (可能需要unsafeBitcast(_:)放到UIView.self ) 但是,还有更多: 如果要向自动布局发出信号,则视图需要一定的空间来容纳其内容,类似于UILabel和UIImageView 。 您可以覆盖intrinsicContentSize 。 我希望我弄清楚了这个主题,对它有所帮助。 在下一篇文章中,我将介绍最佳的替代布局引擎,以及如何制作自己的,敬请期待🙂

CaseIterable在Swift内部如何工作

CaseIterable是我在Swift 4.2中最喜欢的功能之一。 尽管它是一个简单的协议,但它解决了一个常见问题(我个人曾多次遇到),该问题需要访问包含某个枚举的所有情况的数组。 如果我们看一下标准库中CaseIterable的实现方式,我们可以看到该协议正是人们所期望的:一系列案例的简单定义。 public protocol CaseIterable { /// A type that can represent a collection of all values of this type. associatedtype AllCases: Collection where AllCases.Element == Self /// A collection of all values of this type. static var allCases: AllCases { get } } 但是本文与该协议的Swift方面无关。 如您所知,该协议很特殊:您不需要定义和填充allCases类型- 编译器会为您完成。 enum MyEnum: CaseIterable { case foo […]

使用枚举管理TableView节以提高清晰度。

作为开发人员,重要的是我们试图使我们的代码尽可能清晰和安全。 将整数分配给各节可能会导致其他开发人员不清楚的代码,而这些开发人员最终可能会在以后阅读和使用我们的代码。 例如,这是一个典型的tableView,我们在其中使用Integers管理节。 典型方法 func numberOfSections(在tableView中:UITableView)-> Int { 返回 2 } func tableView( _ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell { 切换 indexPath.section { 案例 0: 返回 UITableViewCell() 情况 1: 返回 UITableViewCell() 默认值 : 返回 UITableViewCell() } } 在上面的numberOfSections代码中,很明显我们有2个部分,但是对于开发人员来说,阅读您的代码的这两部分是什么? 在cellForRowe中,我们切换每个部分,并为每个部分返回指定的单元格。 这里有两个问题: 我们必须为0和1以外的任何部分提供默认的tableViewCell。 对于其他阅读我们代码的开发人员来说,尚不清楚第0节和第1节是什么。 枚举方法 一种新方法是使用枚举来管理每个部分。 例如,说我们有一个tableView,它根据他们的运动显示球队列表。 我们有两项运动: 棒球和足球 因此,我们想将tableView分为2个部分,并在这些部分下列出我们的团队,并相应地配置每个单元格。 步骤1:设定枚举 枚举 Sports:CaseIterable { 棒球,足球 静态 函数 numberOfSections()-> Int […]

将RealmSwift转换为Xcode9 / Swift 4

environmentXcode:9.0 GM(9A235) 斯威夫特:4.0 迦太基:0.25.0(于2017/9/12尝试) 在现有的xcode项目中,如果将swift版本转换为4,可能会看到此错误。 通常我必须能够通过迦太基使用它,但是现在我不能了。 看来问题在于RealmSwift并未针对Swift 4采取措施。 因此,让我分享我如何解决它。 https://stackoverflow.com/questions/44640852/how-can-i-use-realm-with-swift-4 https://ja.stackoverflow.com/questions/28951/realm%E3%81%8Cbuild-%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84(日语) 在此之前,请确认xcodebuild版本。 $ sudo xcode-select -s /Applications/Xcode9.app $ xcodebuild-版本 Xcode 9.0 内部版本9A235 将Swift版本更改为4 选择TARGETS,然后移至Build Settings> Swift Language Version。 选择Swift 4。 2.自己构建RealmSwift 一种。 现在,手动下载RealmSwift $ git clone-递归https://github.com/realm/realm-cocoa.git $ cd领域可可 $ git checkout v2.10.0 b。 获取子模块 #在realm-cocoa目录的根目录 $ git子模块更新–init C。 使用脚本构建,通过所需的设备传递参数 如果忘记上一步,构建将失败 $ REALM_SWIFT_VERSION = 4.0 sh […]