Tag: Swift编程

探索Swift

克雷格·格鲁米特(Craig Grummitt)选择的章节 Swift不仅是Objective-C的现代替代品。 自2015年开源以来,Swift已发展成为一种功能强大,现代且富有表现力的语言。 从Web开发到服务器端开发和基于云的服务无处不在! Swift拥有丰富而深刻的技能,可以交付更干净,更快的代码。 您要做的就是找出如何使用它。 探索Swift会提取Manning的三位专家的知识,向您介绍Swift如何处理各种各样的独特问题。 此快速入门指南由iOS开发人员,Manning作者和指导者Craig Grummitt亲自挑选,可让您使用Swift来探索对象,使用枚举为数据建模以及解决图形问题,从而使您对世界上的语言有了深刻的了解数据及其他。 完成后,您将更好地了解Swift的用途,无论是构建下一个大型iOS应用,将其带到服务器上,还是编写无服务器功能! 立即下载此免费电子书 ! ___________________________________________________________________ 有关更多免费内容,请访问Manning的免费内容中心。 ___________________________________________________________________ 关于作者: 克雷格·格鲁米特 是一位成功的开发人员,讲师和导师。 ‘t Veen的Tjeerd是一位高级软件工程师和架构师,负责构建iOS应用。 David Kopec是位于佛蒙特州伯灵顿的尚普兰学院的计算机科学与创新助理教授。

内存管理器通过iOS Swift

Bộnhớthìcóhạn,nêntrongquátrìnhdev taphảiquảnlíchotốtviệccấpphátvàhuỷbộnhớ,đểtránhtrườnghợp内存泄漏。 Mìnhsẽvídụchocácbạntrườnghợphaygặpphải,khi 2 objectstrỏtớinhau 用户级别为2类,用户为Car,用户级别为sau khi khaibáovàgắncác,实例用户为sg gnn,用户级别为bnng,nh classngưiđuxảyralànósẽko类用户。 注意内存泄漏khi保持周期hìnhthànhdo 2biếnstrongcùngtrởt strongi 1địachỉ。 类用户 { 命名:字符串 让电子邮件:字符串 var car:汽车? init(名称:字符串,电子邮件:字符串){ self.name =名称 self.email =电子邮件 } deinit { 打印(“再见\(名称)!”) } } 车类{ let id:整数 让类型:字符串 var所有者: 用户 ? init(id:Int,type:String){ self.id = id self.type =类型 } deinit { 打印(“再见\(类型)!”) } }变量所有者:用户? =用户(名称:“ Vu”,电子邮件:“ vu.vicent@gmail.com”) var car:汽车? […]

即将发布的iOS DevOps书的状态

2018年8月,我在iOS DevOps上宣布了该书,该书的草稿内容已在XCTEQ网站上发布。 从那以后,LinkedIn和Twitter上的许多联系对这本书产生了兴趣。 首先,我要感谢对本书有兴趣的所有人。 当时,我承诺会在2019年初发行该书。现在是3月,我开始收到感兴趣的读者的电子邮件,消息和评论。 这是状态发布,解释了iOS DevOps书籍的状态,完成的内容,剩余的内容以及发布书籍的时间表。 在LeanPub上预订以获取反馈 首先,这本书已上载到Leanpub,供用户查看内容并表现出更多的兴趣,使我有更多的写作动机。 您可以在此处查看Leanpub上的图书概述。 在Leanpub上获得这本书的整个想法是让展示用户进步,并获得实际上有多少人对该书感兴趣的信息。 我尚未决定这本书的定价计划。 我绝对希望免费分发它,但根据权衡取舍,免费提供某些东西会使人觉得书的内容没有价值,而且经常被读者忽略。 另一方面,I或XCTEQ都没有与该书一起推广的产品,因此我不完全确定该书的定价模型是什么。 我需要您的帮助才能查看内容,并让我知道您想为这本书支付多少费用。 同样,通过将图书上传到Leanpub,您会在图书完成时收到通知。 因此,随时访问Leanpub,并表现出一些激发我的兴趣。 该书还带有一个Twitter主题标签#iOSDevOps,因此可以随时在主题标签中进行鸣叫,以便我在Twitter上检查感兴趣的地方。 iOS DevOps实用指南 无论您如何开发iOS应用程序(本机或跨平台),这本书都将指导您为… leanpub.com 设置持续交付。 图书状态 现在,我们将讨论这本书的状态。 现在,这本书与您跨平台或本地开发iOS应用程序的方式无关,其思想和概念将适用。 无论使用哪种技术堆栈来开发iOS应用程序,本书都将引导您充满信心地为iOS应用程序设置“持续交付”。 它涵盖了用于自动执行iOS部署的基础Apple Developer工具和现代CI / CD实践。 本书全部关于自动化iOS基础架构和生态系统,而不是关于iOS开发。 新增/删除的内容 本书首次发行时,大约有30章,分为6节。 在写这本书的时候,发生了几件事,使我删减了本书的几章。 XCUITest的整个部分已从书中删除,因为与书无关。 很少有基于Fastlane工具的章节被删减,而App Store Connect API将成为自动发布iOS版本的首选。 相反,我在App Store API上增加了几章。 在最初的计划中,有一章专门介绍如何在Travis CI,BuddyBuild等不同的云提供商上设置CI。但是,这类服务的提供和功能始终在变化,服务被出售,因此不值得花时间在这些服务上。 相反,我们将介绍一种针对CI的内部解决方案和一种Cloud解决方案。 具有状态的书的最终内容 现在,内容的最终草案已准备就绪,其中包含六个部分,共22章。 第1部分-连续交付和移动DevOps的基础(已完成部分) 第1章,“ DevOps和CI / CD的基础” 第2章,“ iOS开发挑战” […]

Swift中有关运算符的一切

基本运算符,溢出运算符,高级运算符,范围运算符,自定义运算符。 在本教程中,您将迅速学习有关运算符的所有知识。 使用它们非常容易,因为我们可以将它们用于项目中类型(模型对象)的高级用例。 您可以 在此处 阅读基本介绍 ,但不需要了解本教程。 →术语: 运算符是用于检查,更改或合并值的特殊符号或短语。 运算符影响的值为操作 数 。 在表达式“ 2 + 4 = 6”中,“ +”符号是二进制运算符,其两个操作数分别是值2和4。 运算符是一元,二进制或三元运算符: 一 元运算符: 一元运算符对单个目标(例如+1 )进行操作。 一元前缀运算符紧接在其目标(如!b )之前,一元后缀运算符紧随其目标(如c! )之后。 Binary: Binary运算符在两个目标(例如3 + 5 )上操作,并且是不固定的,因为它们出现在两个目标之间。 三元运算符: 三元运算符可针对三个目标进行操作。 与C一样,Swift也只有一个三元运算符,即三元条件运算符( a?b:c )。 注意: 在这里,我将用示例提及所有运算符。 对于简单的例子,除了示例以外,没有其他解释。 如果您想了解更多有关它们的信息,只需遵循本教程底部提供的链接。

动态更改应用程序图标

自iOS 10.3起,Apple推出了一项很酷的功能,以便开发人员能够以编程方式更改应用程序图标。 尽管它不像带有运行时钟的官方Clock应用程序那么灵活,但我们仍然可以基于它来享受巨大的活力。 让我们看看它是如何工作的。 背后的理论 在Apple的API文档中,有三件事值得一看: var supportsAlternateIcons: Bool { get } var alternateIconName: String? { get } func setAlternateIconName(String?, completionHandler: ((Error?) -> Void)? = nil) supportsAlternateIcons是一个只读属性,它决定应用程序是否可以更改其图标。 为了实现它,我们需要在info.plist文件中设置替代图标,我们将在后面讨论。 AlternativeIconName也是一个只读属性,它是当前显示的替代应用程序图标的名称。 请注意,当应用程序显示其主要图标时,它为nil。 setAlternateIconName是用于设置要显示的图标的功能。 如果我们将图标名称设置为nil,则该应用将显示其主要图标。 有关更多详细信息,您可以参考Apple的官方API页面。 由于我们了解如何执行此操作,因此让我们进入Xcode并开始。 先决条件 首先,让我们为应用程序图标放置3张图像,分别是“ pichu.png”,“ pikachu.png”和“ raichu.png”。 请注意,如果将图标图像放在Assets目录下,则正确的位置在project目录下是没有用的 。 这是我的截图: 接下来,我们需要设置Info.plist。 将图标文件(iOS 5)添加到信息属性列表 将CFBundleAlternateIcons添加为字典,用于替代图标 在CFBundleAlternateIcons下设置3个字典,它们对应于“ pichu”,“ pikachua”和“ raichu” 对于每个字典,需要配置两个属性-UIPrerenderedIcon和CFBundleIconFiles 有关更多详细信息,您可以参考Apple的Core Foundation Keys页面。 这是我的info.plist的屏幕截图: […]

作为iOS开发者学徒的12周

第二周 第二周和第一周一样忙碌。 我们的日程安排包括十二个学徒讲座,主题包括项目生命周期(从销售过程到生产前的生产,实施和启动/维护),异步编程和GCD(中央分配),质量保证流程简介,敏捷简介以及如何Intrepid在开发过程中实施敏捷,以及基于用户故事和验收标准进行构建,估算工作原理,回顾和积压工作如何在敏捷过程和持续改进(或通常称为kaizen)中不可或缺的一部分。 除了一些社交活动外,我们其余的时间还花在继续从事小型项目上。 本周,我从事了两个新的小型项目:一个Twitter客户端和一个Spotify搜索应用程序。 如果您从未尝试过将Fabric与Twitter SDK结合使用,则强烈建议您使用。 超级流畅的集成,只需一行代码,只需一行 ,您就可以显示登录用户的时间线,这与Twitter本身是无法区分的,而无需自己重新创建整个表格视图。 还有更多。 构建Spotify搜索应用程序使我有机会再次使用API​​和自定义表格视图单元格。 Xib非常简单,我熟悉从网络请求中提取数据并在Objective C中解析JSON,但是在Swift中进行操作则完全不同。 在与导师进​​行了非常有成效的代码审查之后,我进行了巨大的重构,并学到了很多有关使用协议的快速方法的知识,以及为什么要建立许多库来处理Swift中的JSON解析。 仅举几例:ObjectMapper,Gloss,Mapper(来自Lyft的开发人员),Genome(由Intrepid的前驻地高级iOS开发人员Logan Wright编写)。 这里对其中一些进行了比较:Swift JSON Shoot-out,这是使用Gloss解析的案例。 “在任何时候,如果我们不适应和改变,我们可能会达到一个平台。” Intrepid的整个团队本周齐聚一堂,参加了Intrepid首席执行官兼创始人Mark Kasdorf的“星期五时间”讲座。 “星期五时间”是Intrepid几年来一直在实践的概念。 它随着时间的流逝而发展,因此,在其发展的不同阶段,新员工就出现了。 需要重新定义以便达成集体谅解。 就目前而言,整个团队在下午1点之后的星期五下午有空,可以做除客户工作以外的其他事情,这将有助于他们作为Intrepid员工的成长和福祉。 对每个人确切意味着什么是可以接受解释的。 有人强调, 没有硬性规定。 但是,它必须直接或间接地与Intrepid团队成员的角色有关。 这可能会扩展个人的技能(例如,如果他们是iOS开发人员,则要学习Rails)或加深他们已经使用的工具的理解(例如,Intrepid网站的技术博客),或者有时甚至只是一项有助于从一周中解压缩( 即在办公室咖啡馆打NBA Jam)。 不必每周都一样,就量化结果而言也没有期望。 这个想法是,个人可以利用这段空闲时间来丰富他们的经验并增加他们作为团队成员的价值,并实际上使整个团队和整个企业受益。 我喜欢这个主意。 “如果要成长,就不能教条。” 我们也很幸运地在本周从Mark那里又做了一次有关Intrepid历史的演讲。 从2010年初开始一直稳定增长。每年,他们的员工和收入都呈指数增长。 最大的收获是,这家公司对以其他所有人的工作方式或以往的工作方式不感兴趣。 这是一家对自己在现在和将来的工作中做到最好的公司感兴趣的公司,致力于不断地自我反思,改进和成长。 再一次,改善。 我想说这完全符合我的想法。 最终,本周的上限是上周的两倍。 星期五上午举行有关测试的讲座和讲习班。 我真的很高兴将测试引入我的工具集中。 对我来说,这将是一个全新的实践。 (这是一个很好的测试tut。) 下午是第一次无畏夏季烧烤。 天气非常适合进行草地游戏(包括巨型积木!),聊天更多我尚未见过的无畏窥视,躺在阳光明媚的吊床上或凉爽的草地上的阴影下,烧烤食物(包括菠萝!),甚至冰淇淋卡车美食。

迅捷代码段#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 […]