Tag: iOS应用程序开发

匿名nil

匿名nil是许多Swift代码库中都存在的一种微妙的代码味道。 它是什么? 为什么会出问题呢? 我们该如何解决呢? 最初在 mczarnik.com上 发布 。 让我们举一个简短, 虚构且非常人为的示例。 假设您的代码库中有一个方法可以显示带有动画的视图。 很明显吧? 不,这不是显而易见的。 这甚至都不合逻辑。 这个例子非常人为 ,但我希望您能明白问题所在。 有什么问题? 无论您为获得此信息做出了什么选择,为什么都必须对自己问这个问题? 好的API可以自我说明,在给定某些输入的情况下解释其功能或性能将是其设计者的失败。 就像物理的东西一样-最好的设计不必解释,只要理解就可以。 这里的问题来自可选的过度使用。 可选的含义很严格。 它的意思是: 有一个值,它等于x或根本没有值 而已。 就是这样 。 在我们的例子中, nil的定义是“屏幕底部的默认动画”。 这个nil有一个意思,但是意思是不同的。 这就是我所说的匿名nil , 它 是用作实际参数或变量/常量 的 nil ,其含义不仅仅是“根本没有价值” 。 有什么后果? 无论您在哪里使用nil作为具有特殊含义的值(而且它根本不是“毫无价值”),都会使您的API用户(包括未来的自我)感到悲伤: 他们可能会浪费时间去弄清楚这是什么意思(有时答案可能隐藏得很深)。 他们可能会遇到许多其他使用相似签名的方法,但是每次看到它们时,他们都需要问自己,来自其他方法的规则在相似的地方是否仍然成立? 他们需要在头脑中保持有关API的易变的元知识 他们甚至可能对系统的行为有错误的假设 您如何使它更好? 通常,我们无力进行适当的依赖注入,否则DI并不是解决此类问题的正确工具。 让我们尝试更多地了解问题,并提出可行的轻量级解决方案。 在我们的情况下,该方法有两种可能的结果: 动画将从底部弹出 特定的非零动画将被执行 难道不像是有两种情况的enum ? 确实是的。 如果我们在代码中使用这种枚举怎么办? 很简单: […]

iOS开发人员-26个适合初学者的绝佳资源

因此,您决定全心投入iOS应用开发吗? 好吧,让我们用一组很棒的资源来帮助您,这些资源有望提高生产力。 来自苹果 iOS开发的起点应该是Apple: 苹果提供的一本免费书,名为“ Swift编程语言” 。 WWDC视频。 一个很好的地方,开始聆听来自Apple的最新和最精彩的文章。 博客,播客和课程 您应该查看各种出色的博客,播客和机构课程。 斯坦福大学关于Swift的iTu​​nes课程| 斯坦福大学提供的绝对棒的完整课程,完全免费。 https://medium.com/ios-geek-community | Bob Lee撰写的很棒的新博客。 那里有一些很棒的入门教程。 https://www.raywenderlich.com/category/ios | Ray是最古老和最著名的教程网站之一,拥有大量的教程。 一定要检查一下。 https://talk.objc.io/ | 关于Swift编程的每周视频系列。 http://www.appcoda.com/ | Appcoda有大量出色的教程和大量的初学者和中级书籍。 http://nsscreencast.com/episodes | NSScreencast拥有所谓的“ iOS开发中每周一口大小的屏幕录像”。 也有大量的免费截屏视频。 https://thinkster.io/a-better-way-to-learn-swift | 如果您是Swift的新手,那就太好了。 付费课程 如果您正在寻找可以付款并获得更多商业等级的地方。 https://www.udemy.com/swift-3-learn-to-code-with-apples-new-language/ | 尼克在Swift上有很多课程,并且反馈很多。 您还可以在Udemy的其余部分中进行搜索,以查找其他众多教师的课程。 https://www.codeschool.com/courses/app-evolution-with-swift | Code School的月度计划费用为29美元,使您可以选择各种不同主题的课程。 https://designcode.io/ | 如果您是一位打算从事App开发的设计师,那么这是Meng To的完美入门课程 时事通讯 我强烈建议您订阅的新闻通讯清单。 它们都是大量的提示,新闻,建议和信息。 http://nshipster.com/ | […]

Swift:约定好,字符串坏

我真的很喜欢Apple API。 我认为它们是合乎逻辑的且经过精心设计。 但是他们的某些选择只会使我瘫痪。 一种选择是使用字符串作为键路径或标识符。 在编译期间不检查字符串,您可以很容易地错误键入它们。 否则名称可能会更改。 哦,我还记得那些漫长的夜晚,当我尝试在UITableView中查找内存泄漏时,发生了这种情况,因为我忘记在Interface Builder中为我的单元格设置了reuseIdentifier 。 那些痛苦和遗憾的时刻。 另一个问题是,我的代码很容易出错,因为我在整个项目中都重复使用了单元格,这导致我创建带有标识符的常量头,这很麻烦,因为我必须不断将其与笔尖名称和标识符同步。 总体而言,我喜欢的字符串太多了。 其他开发人员的代码看起来和使用起来更加痛苦,因为它看起来像是直接从Apple教程中复制粘贴的代码,这些代码在各处都具有Massive View Controllers,并且具有零可重用性和可扩展性。 可悲的是,这样的代码甚至在今天都可以看到,并且在过去,平均而言,也没有比这更好的了: 因此,大约7年前的一天,我开始反思自己的事迹和周围人的事迹。 我觉得我是一个罪人,那不是永远的。 我脑子里有一个特别的问题:“我们为什么要使用Apple约定,却害怕创建自己的约定?”然后,我环顾四周,发现基于CoreData的ActiveRecords确实有自己的约定,我的团队也有。 它们只是没有形式化,没有得到很好的利用。 我很开悟。 我决定,我想创建约定以简化从辉煌的一天到永恒的代码。 但是我感到,公约同时是危险的,因为每个人都必须遵守它们。 因此,我记录了他们的心声,并在团队中谨慎而勤奋地向整个团队宣传。 我在那个时候恢复了我的行动和想法,但是我用Swift重写了它们,向您展示了如何自己分析和创建约定。 形式分析使我发现了一个发现。 所有单元格都有标识符,这是其类名的直接派生词。 而且,所有视图的所有笔尖都具有与该特定视图的类相同的名称。 首先,我摆脱了细胞问题。 我创建了一个约定,那就是我们所有的单元类名称和重用标识符应相等: 注意,我立即创建了一个负责类型字符串化的函数。 在那个时候我们不需要它,但这是常见的切入点,可以在以后需要时允许扩展。 在ObjC时代,我们可以重载扩展中的任何属性,但是我没有这样做,而是创建了IDPTableViewCell子类。 为什么? 很简单,我们与其他开发团队的代码具有互操作性。 而且,如果我超载了UITableViewCell redirectIdentifier ,我会弄乱其他人的代码,他们可能会使用不同的甚至根本不使用任何约定。 然后,我想,我想摆脱表视图中的字符串,这意味着我需要从UINib中删除字符串(那时没有UINib ,只有旧的NSBundle.loadNibNamed ,但是正如我之前提到的,我希望了解我的故事): 我创建了许多其他方法,从用于表视图的API中完全删除了字符串(我保证很快就会开源)。 我的生产代码开始看起来像这样: 虽然这不是LOC部门的重大改进,但此代码还是有一个巨大的胜利:我不必再费神笔尖中的字符串和标识符了。 我想提及的另一种情况是完全不同的,但也与约定有关。 经过分析,我发现项目中的所有视图控制器笔尖都具有与视图控制器类相同的名称。 这与苹果公司本身所强加的惯例是一致的。 但是真正的问题是,我的产品负责人(希望您在读这篇文章时能在地狱中度过一个愉快的假期)想要不同的笔尖,这些笔尖的布局完全不同,适用于不同的设备,那时没有尺寸级别。 那就是我发现的时候,如果需要的话,这些约定应该可以扩展。 因此,我有了解决方案—重载了抽象视图控制器类的nibName属性。 我真的很高兴拥有该类,因为否则我将不得不创建它并相应地重构所有代码。 因此,我想到的另一个约定是:“为您计划从中继承的所有基础组件创建子类”。 在我的情况下,它们是UIView , […]

为什么要为iPhone应用程序项目制定路线图

在MobDesign上,如果没有先进行路线图课程,就不会吸引客户。 您会问什么是路线图会议? 好了,路线图会话使我和客户能够创建一条从客户今天到客户希望明天的路径。 这些会议通常要花几个小时到一两天,这取决于项目的规模。 以下是我们在这些会议期间将涉及的各个主题。 您的业​​务目标 我想知道您要通过项目实现的目标。 您的目标是创建一个MVP来测试市场吗? 为已被证实但需要吸引更多用户的想法创建v1? 创建一个内部应用程序来帮助您的员工提高效率吗? 创建一个营销应用程序来展示您的产品? 我为什么在乎? 毕竟,您是带着我对应用程序的想法来到我这里的,为什么我不今天才开始对其进行编码? 好了, 有很多方法可以创建iPhone应用程序 。 对于MVP,我可以创建一个无法处理所有极端情况的应用程序,因此可以在探索应用程序概念是否值得的同时节省开发成本。 对于V1项目,要在稳定性,可维护性和监视性方面进行大量考虑,以使您将来可以轻松构建产品,并且不会每隔5分钟出现在用户面前。 因此,根据您的业务目标,项目其余部分的对话将有所不同。 您的目标受众 我记得我在加入Office.com团队几周后在Microsoft时问:“我们为谁设计此功能?”。 我的老板回答:“每个人”。 即使对于有数百万访问者的网站,这也可能是最差的响应。 您总是在为目标人群设计。 并非每个人都希望使用Instagram,Twitter或您的保姆发现应用程序。 与您的应用想法相同,知道为谁设计应用程序,将使您和我能够优先考虑您的用户故事,从而使我们能够针对您所针对的人群设计应用程序。 您的用户故事 这是很多人感到困惑的地方。 通常,客户会向我提供功能列表,然后向他们询问用户故事。 无论如何,用户故事是什么? 从https://www.mountaingoatsoftware.com/agile/user-stories 用户故事是对功能的简短描述,从需要新功能的人员(通常是系统的用户或客户)的角度出发。 它们通常遵循一个简单的模板: 作为,我想要,以便。 用户故事通常写在索引卡或便签上,存储在鞋盒中,并排列在墙壁或桌子上,以方便计划和讨论。 因此,他们将注意力从写作功能转移到讨论功能上。 实际上,这些讨论比任何书面内容都重要。 因此,用户故事实际上只是在思考用户想要做什么。 然后从这些中定义实现此目标所需的功能。 您会以多种方式解决用户的问题,您会感到惊讶。 而且有些创建起来比其他的要昂贵得多。 您的预算 有些人不喜欢谈论这个。 他们担心如果他们告诉我他们的预算,我会给他们引用这个数字。 这不是我的意图。 为了解释为什么这是一个重要的话题,我喜欢使用汽车类比。 如果您去找汽车销售员并告诉他:“我要汽车”。 他能够为您提供不带任何装饰的小型现代汽车或满载的保时捷SUV。 而且,在功能,质量和完成度各不相同的情况下,您仍将有很多选择。 了解您的预算可以使他和您将选择范围缩小到您可以负担得起的汽车 。 不过,您仍然可以购买低于预算的汽车。 应用程序也一样。 如果您已经有了预算,并且拥有一系列用户案例,那么我将为您提供如何在预算范围内实现业务目标的选择 。 […]

获得报酬做开源。

本文应该是很久以前写的,但碰巧的是,当您玩得开心时光飞逝。 我的前同事约翰·桑德尔(John Sundell)去年(2017年)进行了一场路演,但他一直在质疑我们如何进行开源并为此获得报酬。 现在是时候揭开秘诀了。 它可能不像您想的那样秘密。 开源是我非常关心的事情,实际上,我在2017年Mobil时代谈到了这一点。 一切如何开始 在加入公司之前,Hyper的开源就开始了。 它基于这样一个简单的前提:如果我们要使用开放源代码,那么我们也应该做出贡献,通过帮助现有项目或在Hyper的保护下创建新的开放源代码。 害怕做开源 当我申请Hyper职位时,我会给你一个秘密,我从来没有做过iOS应用程序,反正做得不好。 哎呀,我什至不知道使用表视图时出队,更不用说我曾经公开发布过任何代码了。 我输入了一个全新的域。 但是,我确实有OS X开发方面的业余经验。 数周以来,我感到害怕,因为我被贴上欺诈的标签,比进入后的轿车门缩回更快,被赶出了公司。 对我来说幸运的是,Hyper是一个超级办公的好地方,其核心是协作和知识共享。 我很快学会了正确地完成工作所必须要做的事情,但是我仍然有一个很大的恐惧,那就是公开地与公司的核心价值发生冲突,这就是对开源的恐惧。 我不能全神贯注于会带来什么,我只是将其视为发现我作为蛇油推销员的另一种方式。 进行开放源代码开发的领先者是Web团队,他们在Ruby on Rails上投入了大量资金,并生产了与社区自然共享的出色宝石。 碰巧,我为Hyper发布的第一个开源软件是一个名为singleton-rails的红宝石,我的同事Tim Kurvers承担了繁重的工作,我或多或少只是将其推到rubygems.org。 即使在这种情况下,我仍然很害怕在公开场合露面我的名字。 早在2014年,“过去”就被吓呆了。 如果我可以放心,我会拥抱他,告诉他一切都会好起来的。 说明开放源代码无所畏惧,但值得拥抱,美好时光已经来临。 然后,我将摘下他的锡箔帽子,称赞他的头发。 “宇宙不会围绕你旋转!” —将来我给过去的我一些建议 我知道很多人对此感到害怕,当这样的事情出现在Twitter上时,谁能责怪他们。 我知道作者对该推文没有害处,但很快就升级为在线嘲讽。 我什至为在Slack上开个玩笑而感到内,,因为它缺乏排序对我的OCD造成了伤害。 但是,即使我的评论是私人的,我也应该知道得更多。 如果这确实使我感到困扰,那么我本可以进行PR来纠正问题,而不是取笑别人的源代码。 我当然不希望任何人对我这样做,如果他们在我的代码中找到了任何恶作剧,我很希望PR来解决。 如何开始 在Objective-C和Swift过渡期间,我们的团队完成了迄今为止最大的项目之一。 一个明显的问题暴露出来,我们选择哪种语言。 我们对此进行了许多回合,来回跳动,弹出了不同的论点,这些论点被无效和纠正。 最终,我们登陆了Swift。 这给了我们在社区中编写纯Swift框架的独特位置,这在当时是一个真正的热门话题。 我们是由四个开发人员负责该项目的,因此决定将项目拆分为不同的功能,并为应用程序的每个部分组成微型团队。 每个功能都有自己的规范,我们共同检查了所有这些规范,并一致决定可以将哪些部分提取到框架中。 通常会导致规模扩大的两个主要原因,第一个是“我们能否在其他应用程序中利用此功能”这个问题的结果,另一个是:“如果这是它自己的组件,它将加快开发速度。”

美国排名前20位的iPhone App开发公司

在移动应用程序开发方面,我们认为两家公司在为iPhone和Android应用程序提供独家移动应用程序方面表现最佳。 当然,知名的移动公司为这两个平台都提供了可靠的应用程序开发。 不过,其中有些人拥有开发异常iPhone应用程序的良好资源和能力,而其他人则擅长构建Android应用程序。 根据我的二次研究,在这里,我列出了少数几个领先的iPhone应用程序开发公司(排名不对)。 了解20家不同的公司及其在开发突破性的iOS / iPhone应用程序方面的卓越表现。 1)加油 对燃料的团队以对质量的坚定热情团结在一起。 我们是一个由开发人员,设计师和策略师组成的团队,他们热衷于追求移动应用程序的鲜血,分裂,前沿。 我们并非仅在任何应用程序或任何客户端上工作。 我们早上来上班,为最佳客户构建最佳应用。 这就是让我们打勾的原因。 2)因图兹 Intuz是一家全球定制移动开发和云解决方案公司,总部位于加利福尼亚州圣克拉拉。 Intuz提供广泛的IT解决方案,例如移动应用程序开发,云服务,AWS服务,UI / UX设计,应用程序营销,自定义Web应用程序和自定义软件开发。 我们是一个充满激情的应用程序开发人员团队,除了设计和编写应用程序外,他们还会喝酒,吃饭,娱乐,思考和交谈。 我们对工作的热情反映了我们的价值观,并为我们的客户带来了愉快的体验。 3)起毛 Fuzz是一家移动产品代理商,经过有意发展并具有独特的地位,可以与全球组织中的产品和平台领导者合作,以创建,管理,扩展和发展其产品生态系统。 我们提供广泛的服务,例如移动应用程序开发,Web开发,iOS应用程序,Android应用程序,iPhone应用程序,iPad应用程序,电子商务,医疗保健/制药,移动商务,新兴技术等。 4)智能软件 在Intellectsoft,我们致力于创建一个智能软件有助于改善数百万人生活的世界。 Intellectsoft成立于2007年,后来发展成为一家国际性的,全面的软件解决方案开发公司,在硅谷,纽约,伦敦,奥斯陆,赫尔辛基和明斯克设有办事处。 Intellectsoft是一家屡获殊荣的工程公司,为企业客户构建,维护和支持关键业务应用程序。 5)WillowTree,Inc. 从制定移动战略到推出移动产品,我们帮助客户认识到快速发展的移动技术的潜力。 我们独特的团队使我们能够在最高战略水平上解决客户的疑虑,同时确保在现实世界中的构建成本和时间表中提出所有建议。 然后,我们拥有在移动产品设计,开发,测试和发布阶段中采取该策略的专业知识。 6)Zco Zco Corporation自1989年以来一直从事实时软件开发。Zco是经过实践检验的供应商选择,它通过可靠且可靠的方法为客户创造有吸引力的,具有弹性的产品。 作为世界上最大的应用程序开发公司之一,Zco致力于提供专家级软件服务。 其强大的团队经过精心挑选,专门研究移动应用程序开发,企业软件和动画服务。 7)Algoworks Algoworks是一家全球外包IT服务公司,我们的业务是使离岸战略适用于ISV和支持软件的公司。 为了跟上快速增长的IT外包的步伐,我们提供的各种服务包括软件产品工程,定制应用程序开发,软件测试服务,智能手机开发服务以及围绕Alfresco,Liferay,Sharepoint,Salesforce,Microsoft Dynamics CRM, SugarCRM等。 8)蓝鲸应用 您需要开发一个应用程序。 您可能打算使用它来帮助您开展业务,实现实际目的,或者只是为了娱乐和吸引用户。 无论如何,您将要投资于能够将想法付诸实践并完美执行的iPhone应用程序开发人员。 您希望您的iPhone应用程序开发公司在移动应用程序开发,设计和测试方面拥有丰富的专业知识。 9)诱人的手机 对于初创公司的创始人和产品经理,我们开发了移动MVP来启动或展示; 做到了完美,快速和固定的价格。 我们提供全栈服务:UX UI,开发人员,质量检查人员,通常带有小型后端。 我们擅长提供质量可靠的出色UI。 我们在项目交付中总是准时(我们使用Scrum)。 我们遵循固定价格模型-我们面临的风险。 […]

在Swift中编写更好的单元测试:第一部分

问题 瞧,我们是这里的朋友,所以我觉得我很坦白:我在职业生涯中写了一些非常糟糕的单元测试。 20行怪物,具有多个模拟和断言以及异步期望。 您在书中看到的这类标题为“如何修复以前工作过的白痴留下的混乱”的书。我还必须在写完单元测试和不太那么说的代码后维护该代码。更好。 可以这么说,我现在将编写“好的”单元测试作为优先事项。 在开始之前,我将定义我认为是“良好”的单元测试。 如果我们可以同意一个单元测试(或者实际上是任何一个测试)是由一些设置 ,我们正在测试的动作以及关于该动作效果的断言组成的,那么我可以这么简单地说,一种“好的”单元测试可以使这三个组件中的每一个都清晰可见。 (此外:这可能与您对“好的”单元测试的定义有所不同,而这只是我们俩都必须忍受的。) 在一些博客文章中,我将向您展示我们在Clue所做的一些工作,以确保我们始终试图编写“良好”的单元测试。 在本文中,我们将看一个简单的技巧,我们可以使用它来最小化单元测试的设置部分,同时保持清晰度。 假设我们要在一个简单的Swift结构上对相等方法进行单元测试。 struct用户:Equatable { 命名:字符串 让电子邮件:字符串 让需求验证:布尔 静态函数==(lhs:用户,rhs:用户)-> Bool { 返回lhs.name == rhs.name && lhs.email == rhs.email && lhs.needsVerification == rhs.needsVerification } } 我们可以(无限)有许多不同的参数组合可以传递给此方法进行测试。 显然,我们无法对所有这些进行测试,因此我们必须选择一些代表总体趋势的案例。 对该方法进行单元测试的有效方法(实际上,我通常会使用测试驱动的开发方法编写这种方法)是从两个User的所有属性均相等的情况开始,然后测试每个属性不同时会发生什么。 这给了我们这样的测试套件: func test_equals_allPropertiesMatch_isTrue(){ let sut = User(名称:“”,电子邮件:“”,needsVerification:false) 让其他=用户(名称:“”,电子邮件:“”,需要验证:false) XCTAssertEqual(ut,其他) XCTAssertEqual(other,sut) } func test_equals_nameDiffers_isFalse(){ let sut = User(名称:“ Jo”,电子邮件:“”,需要验证:false) 让其他=用户(名称:“”,电子邮件:“”,需要验证:false) […]

Swifty Firebase API @ Ka-ching —第4部分

自动代码生成和开放源代码 这篇文章是该系列文章的第4部分,我们将探讨如何构建Firebase API的Swift扩展。 到目前为止,我们已经讨论过添加对Firebase Realtime Database API的Codable支持,添加定义数据库结构模式的类型安全路径以及向API添加RxSwift扩展。 在本文中,我们尝试将当前讨论的所有主题包装到两个非常轻量的框架中,这些框架可以轻松地包含在您自己的项目中。 这提供了无懈可击的Codable支持,键入安全路径和RxSwift扩展名-您可以选择想要使用的功能。 但是,在我们开始讨论开源框架之前,让我们看一个可以使我们的生活更轻松的主题: 自动代码生成 在有关类型安全路径的文章中,我们描述了一种使用Path类型的受约束扩展对层次结构建模的策略。 这些扩展要求键入很多样板。 诸如Sourcery和SwiftGen之类的工具由于一些很好的原因而变得流行: 样板很无聊,易于维护。 从某种形式的资产自动生成的代码将保持最新状态,因此,如果您删除或重命名资产,如果您的代码仍引用这些资产,则会立即出现编译错误。 因此,为何不必键入和维护大量的幻像类型和受约束的Path扩展,为什么不只定义您的模式并让代码自动生成呢? 考虑以下示例架构: { “ configuration”:“ Configuration”, “聊天室” : { “ ”:{ “邮件”:{ “ ”:“消息” }, “ name”:“ String” } } } 这将定义从结构的根部到叶节点的Paths ,这些Paths必须与代码中的模型类型名称相对应。 包裹在尖括号中的json键表示树中此刻的数据是集合的一部分。 您会注意到,没有实体定义聊天室。 出于上述架构的考虑,没有对应于聊天室的模型类型,但是您需要创建一个通往聊天室的路径才能获取该聊天室的消息。 这个概念是使用幻像类型建模的。 代码生成器将生成一个没有值的名为Chatroom的枚举。 这意味着Chatroom永远无法实例化,但仍可以在我们的代码中用作通用限制。 使用从以上架构生成的代码,您可以生成如下路径: 让messagesPath = Path()。chatrooms.child(“ firechat”)。messages 或者,您可以使用自动生成的便捷方法,该方法将.child(_ key:String)方法包装如下: 让messagesPath = Path()。chatroom(“ […]

Swift:类型推断

我要坦白。 我真的对在我的代码中各处编写iflet和guard感到厌倦。 我看到一些真正的基本问题: 您正在与Swift斗争,而不是表达需要完成的工作; 您没有到强制转换代码的中央访问点; 您对Swift API的更改不满意。 您必须编写更多代码,自动完成功能将无法为您节省$ 您不使用类型推断。 首先,让我介绍一下我使用的强制转换功能: 是的,那只是上面的包装? 。 为什么好呢? 它允许在不考虑Swift的预处理限制的情况下转换为类型,而Swift的预处理限制仅出于帮助开发人员的原因而创建,这些限制对类型一无所知。 一个很好的例子是Int? 要转换为Int?的类型(是的,可选的包装在可选的包装中,您没有误读)。 猜猜是什么,编译器不会让您用as那样做? : 编译器失败,并从’Int ?? 到“诠释?” 仅解包可选; 您是要使用’!’吗? 。 这意味着,编译器可以做到这一点,但是,它认为它更了解程序员想要什么,因此它试图通过强调,通过展开Int来提供帮助。 进入Int? 我们收到Optional 作为结果。 哦,非常感谢你,Obvious上尉,没有您的宝贵帮助我们就无法猜到。 因此,另一种解决方案是使用泛型类型。 您可以从Swift本身的角度(如果我们可以禁用程序员的健全性检查)来看,泛型中的类型可以是任何类型,包括函数,可选,数组或其他任何类型。 而且,你猜对了, 诠释? 以及诠释? 也是分开的类型。 而且, 作为? 本身可以用于解包(尽管我理解为什么强制转换可能导致解包的原因,而AST和SIL都没有提供这种行为的任何线索)。 因此,如果我们看一下上面的强制转换函数,是否要强制转换并从Int中解包? 输入Int? ,我们可以这样写: 这将向我们显示:Optional(1)。 另一方面,如果我们尝试转换Int? 转换为Int类型的系统将按预期方式运行,并且不会打印任何内容: 但是,这种功能尽管是类型推断(启用并可链接),但就您必须编写的代码量而言,并不是特别有用。 可以通过使用函子,应用函数或单子函数来缓解这种情况。 我可以承认,我正在迈入函数式编程的第一步,因此,在设法掌握FP背后的思想以及如何将它们与OOP可变状态混合后,我将在以后的博客文章中介绍这些类型。在一个友好的功能社区的帮助下(对所有的lispers和haskellers表示敬意,他们回答了我的愚蠢问题,并编写了免费的开源书籍,以简单的方式解释了困难的概念,你们是最棒的,伙计们)。 现在,让我们以简单不正确的方式定义这些类型: Functor —类型,谁实现地图 ; 适用性-类型,实施者; Monads —类型,谁实现flatMap 。 […]

Swift片段#8-收藏

您可以在这里找到其要点 ! 上面的代码片段使以集合方式访问after和before元素变得更加容易🚀。 如果后续元素不存在,则仅返回nil 。 让我们看看它的用例。 如果您想知道Swift-Snippets的诞生,或者想查看更多此类片段,可以在这里找到它们find