Tag: swift

征服ReactiveSwift:信号和观察者(第3部分)

大家好! 欢迎来到征服ReactiveSwift的第3部分。 在上一篇文章中,我们讨论了ReactiveSwift的各种原语。 在这一部分中,我们将讨论Signal ,它是Source类别下的一个重要原语。 本文将指导您完成创建信号并通过Observer进行观察的过程 。 信号 在函数式无功编程(FRP)中,我们将系统建模为时变函数。 这只是意味着我们定义了系统随着时间的流逝如何运行。 与命令式编程相反,在命令式编程中,我们在给定的时间点管理系统状态,而在FRP中,这里我们处理一段时间内状态的变化。 Signal的概念很好地体现了这种“随时间变化”的概念。 信号定义为事件流,其中每个事件代表给定时间点的系统状态。 事件 ( 信号的基本单位)可以是以下类型之一: 值 :任何类型的有效信息 失败 :指示流已完成,并显示错误 已完成 :指示流的成功结束,将不再发出其他事件 中断 :表示事件产生已被中断 信号继续发送“ 值 ”类型的事件流,直到遇到“ 失败/完成/中断 ”类型的事件。 一旦信号发出类型为“ Error / Completed / Interrupted ”的事件,它将停止发送任何值。 观察者 为了观察信号发出的事件,ReactiveSwift提供了一个称为Observer的原语。 观察者是围绕(Event) -> Void类型的闭包的简单包装。 它封装了响应信号发出的事件的系统行为信息。 假设我们要观察一个发射整数值的信号 。 我们将定义一个观察者,如下所示: 让观察者= Signal .Observer {(event)in 切换事件{ 案例让.value(v): print(“ value = \(v)”) […]

4个免费(有趣)工具可帮助您成为更好的编码员

学习如何编码很难。 曾经有一段时间,学习编码的方式被视为书呆子和极客的游乐场。 幸运的是,时代已经改变,大多数人都会勇敢地告诉你,学习如何编码(以及其他有助于您提高技能的相关技能)不仅会帮助您成功开展业务,而且还将是必不可少的技能。 虽然这并没有使它更容易学习。 实际上,从学习基础知识到成为一名熟练的Web开发人员之间的时间可能是编码人员一生中经历的最艰巨和最困难的时期之一。 对于几乎没有开发经验的人来说,选择一种新的计算机语言是很困难的,有时您会觉得自己有时在进行一场永无止境的艰苦战斗。 由于编程是现代人可以学习的最有价值的技能之一,所以我创建了一些在线的最佳有趣,免费(是的,您没看错)的课程列表,这些课程可供需要休息并想休息的人在线使用享受他们的旅程。 斯威夫特游乐场 如果“ Swift”一词听起来很熟悉,那可能是因为您之前听过。 程序员用来为iOS和Mac创建应用程序的语言。 Swift Playgrounds是一个iOS应用程序,可帮助某人学习如何编程,让他们引导角色穿越世界,然后扩展他们的世界,并最终创建自己的世界和游戏。 图形精美,进度似乎合乎逻辑(完整的应用程序要到秋天才可用),并且代码是真实的。 实际上,苹果表示用户将能够共享代码并将代码从Swift Playgrounds迁移到XCode进行进一步的开发。 Flexbox Froggy 首先,找到一种使学习乏味的基础知识变得有趣的方法很重要。 输入:Flexbox Froggy,它将在有趣的环境中教您Flexbox的基础知识,并确保您乐在其中。 使用惊人的编码技能,帮助企业家青蛙回家。 您会发现很多奇妙的宝藏,并且发现了一些新颖的新方法,这些方法可以通过创造性的方式超越初学者。 它将增强您已经知道的基本HTML和CSS,同时帮助您介绍一种新的思维方式。 我的世界 Minecraft是世界上使用最广泛的编程游戏之一。 它的下载量已超过4000万次,围绕它的使用构建了完整的学校课程,并教会了数百万人如何将其思想转变为计算机操作。 所有这些都包含一些有史以来最可识别的块图形。 新手程序员可以使用此游戏来发现世界的内容并构建事物,而无需离开计算机。 没有确定的获胜脚本,只有大量的探索和建设,每个任务都能获得成就点。 虽然该游戏不是免费的,但绝对不昂贵,价值35美元。 如果您仍然不愿意这样做,请确保签出Beta版本。 CodeMonkey 如果与可爱,可爱的猴子一起玩的想法是您的有趣时光,那么您会爱上CodeMonkey的。 它讲授了HTML5编程的基础知识,该基础知识用于帮助可爱的猴子摆脱困境,并最终找到回家的路。 成功的编码人员甚至可以在游戏结束时创建自己的应用程序,然后在线出售($$)。 喜欢你读的书吗? 定期查看更多帖子,或在Twitter上 @TakaraSmall 关注我 。

Swift用Swift编写的AST。 ∞的第7部分

在上一部分中,我介绍了struct和class声明。 在这一部分中,我将描述Swift语言的另一个基本支柱:协议。 通常,让我们从语法开始: 好吧,看起来就像是类和结构。 但是,它不允许在协议内部定义任何声明,而只限于几种严格的情况。 让我们为该语法编写代码。 struct ProtocolDeclaration { let属性:[Attribute] 让accessLevel:AccessLevelModifier? 命名:标识符 让typeInheritance:TypeInheritanceClause? 让成员:[ProtocolMember] } 枚举ProtocolMember { 案例var(ProtocolPropertyDeclaration) 案例`func`(ProtocolMethodDeclaration) 案例`init`(ProtocolInitializerDeclaration) 案例`subscript’(ProtocolSubscriptDeclaration) 案例`associatedtype`(ProtocolAssociatedTypeDeclaration) case`typealias`(TypealiasDeclaration) 案例editorStatement(CompilerControlStatement) } 属性 这是var声明的简化版本。 使用struct对其建模应该非常容易: struct ProtocolPropertyDeclaration { let属性:[Attribute] let修饰符:[DeclarationModifier] 命名:标识符 let类型:TypeAnnotation 让getter:GetterKeywordClause 让setter:SetterKeywordClause? } 有趣的是,此精确声明与常规var声明的一部分匹配。 这可能是Swift语法中有些技术欠佳的迹象。 方法 struct ProtocolMethodDeclaration { let属性:[Attribute] let修饰符:[DeclarationModifier] 命名:标识符 让genericParameters:GenericParameterClause? 让参数:[参数] 让throwBehavior:ThrowsMo​​difier? 让结果:FunctionResult? let`where`:GenericWhereClause? } 再一次。 这看起来与常规func声明完全一样,但是没有主体代码块。 […]

Swift中的TDD简介

我的第一篇英文著作,所以开始吧begin 在本文中,我将尝试向您介绍TDD(测试驱动开发)。 那是什么 TDD是一种软件开发技术,仅要求您先编写测试,然后编写实际代码才能通过您之前编写的测试。 如果您的代码必须处理其他情况,或者要向软件中添加新功能,或者要修复该错误,那就很简单。 只需再次编写不同的测试,然后编写代码以再次通过该测试。 因此,如果您实施TDD,则您的开发周期将像这样 编写并运行测试 编码 重构 重新运行测试 如果您的开发阶段尚未完成,请返回第一。 使TDD更快捷 在您的Swift项目(iOS应用程序或macOS应用程序)中实现TDD非常简单。 您将只编写从XCTestCase类继承的类,定义您的测试用例,然后运行该测试。 我将向您展示如何进行测试,在本示例中,为简单起见,我将使用Xcode Playground进行所有这些测试。 在此示例中,我将创建解决该简单问题的算法。 您是游戏开发人员。 您将构建一个简单的格斗游戏,其中涉及2名战士互相斗殴。 每个战士都可以攻击他的对手,并拥有生命力计和伤害力。 如果战斗机受到攻击,他的生命量将因对手的伤害力而减少。 示例对象 塞纳570 60 RKO 510 65 第1栏是战斗机的名称,第2栏是战斗机的寿命表,最后一个是战斗机的伤害力 步骤1 定义战斗机 为了使您的代码通过该测试,您必须在Player类上修改attack(opponent:) 霍雷! 您的测试已通过

Jitters先生(适用于iOS)

我们相信,Foursquare API是世界上最先进的位置API,独立开发人员和全球企业都在使用。 作为我们自己的应用程序开发人员,我们想展示将功能强大的位置情报集成到应用程序中有多么简单。 为了突出显示许多应用程序中常见的一些位置端点,我们创建了一个名为Mr. Jitters的示例应用程序。 适用于iOS的Jitters先生可在App Store上获得,也可在GitHub上开源。 我们热爱咖啡,因此我们决定将Swarm广受爱戴的Jitters先生标签贴到手机上,以快速找到世界上最好的咖啡,无论您身在何处。 我们希望采用这种非常简单的概念来寻找咖啡,并在此过程中展示两个Foursquare API端点:搜索和探索。 总览 打开应用程序后,用户可以通过点击屏幕中间的Mr. Jitters图标来开始寻找咖啡因。 然后,我们向用户提供他们当前所在的地点以及步行范围内最好的咖啡店。 如果用户点击某行,他们会在地图上看到咖啡店,他们可以从Foursquare.com获取路线或更多信息。 *从左到右:主屏幕,搜索视图,地图和方向 在本演练中,您将学习如何: 注册Foursquare API密钥 确定设备在现实世界中的位置 查找该地区推荐的最佳场所 如果要在继续之前先查看实时应用程序,可以从App Store下载它。 本教程是用Swift 3编写的,适用于熟悉iOS开发的人员。 如果您以前从未构建过iOS应用程序,请查看一些出色的在线资源以开始使用。 获取代码 最好的开始方法是从GitHub获取代码并在XCode中打开。 该项目是在Swift 3中构建的,因此您需要XCode 8或更高版本。 应用程式结构 该应用程序由三个View Controller组成: HomeController.swift | 带咖啡搜索按钮的主屏幕 SearchController.swift | 搜索结果页面显示您当前所在的地点以及附近最好的咖啡 DetailsController.swift | 在地图视图中显示咖啡店,其中包含指向Foursquare场地页面的链接以及有关路线的链接 为简单起见,我们决定不将第三方库用于核心位置或HTTP网络。 这样,您应该能够将任何这些代码复制粘贴到自己的应用程序中,而无需安装其他依赖项。 但是,如果您的应用程序已经在使用Alamofire或SwiftLocation之类的库,则应该可以轻松地将此代码集成到这些软件包中。 设置Foursquare API 要注册免费的Foursquare API密钥,请导航至developer.foursquare.com并创建一个新应用。 创建新应用后,您将获得两个非常重要的信息,即客户端ID和客户端密钥。 您将需要同时使用这两者来开始对Foursquare进行API调用。 获得客户端ID和客户端密钥后,将其粘贴到SearchController.swift中的CLIENT_ID和CLIENT_SECRET变量中。 让client_id =“ […]

开源∝了解更多

一个晴朗的周末,周围到处都是雪,没有阳光……(哦,错过了我住在斯德哥尔摩的消息),我开始在Linkedin上寻找公司如今在有经验的iOS开发人员中寻找的东西,因为我加入了我的公司大约2年前,很长一段时间都没有在Linkedin上浏览过Job。 所以想知道还有什么我不知道并且应该赶上的东西。 令我震惊的是,几乎所有的职位空缺仍在寻找Objective C专家! 我已经在Objective C上构建了4年的iOS应用程序,但是Swift逐渐发展起来后,我和我的队友开始转向Swift,现在距我在Objective C编写任何东西已有2年了。这对我来说非常令人惊讶关于为什么公司不使用Swift并害怕迁移到Swift的原因! 实际上是为了找出答案,我问了一个招聘者这个问题,他说这是因为他们认为用Swift编写应用程序会使应用程序尺寸更大! 我们的应用程序包含大量文件和类,但仍为13MB🤔 然后,有些工作需要对堆栈溢出做出更多贡献。 我可以理解,如果公司想知道您愿意为贡献和分享知识做些什么,但是将其强制性设置则有点奇怪。 我想认为在Stack Overflow上不花很多钱有时是件好事,因为您不是一整天都在寻找问题以试图回答问题并获得一些积分,而是您忙于在办公室工作并试图为票务做贡献和分配给您的故事。 我见过一些人花了30%的工作时间尝试活跃在SO或Twitter上,以便您能获得这些要点,这真的很好吗? 🤔可能在周末或办公时间以外做出贡献是一件好事,但在有报酬做其他事情时却没有。 开源的 最后,我非常重视Github项目,我认为这很棒,因为您可以了解开发人员的实际代码和编码标准,并查看它是否符合您的期望。 这让我想到,如果我的日常工作之外的某个人似乎对我的代码有所了解并进行审查,那么我可能会开始学习不同的东西,并且它的压力可能会使我学到更多。 因此,最终由于这个原因,我开始将周末的业余爱好项目上传到Github。 第一步,我有一个想法,使UICollectionViewLayout更加有用和灵活,而不是仅仅局限于一次,并且在我本地创建了一个项目,我将该项目开源并通过cocoapods公开了-FlexiCollectionViewLayout。 这帮助我学习了依赖项管理器,可可豆荚,Swift软件包管理器和迦太基。 开源之后,我意识到我可以做得越来越好。 现在,这变得令人上瘾了,我有一个包含数十个想法的待办事项清单,我从来没有从事过😣,他们现在正在形成并已开始着手研究。 因此,我的观点是始终关注工作门户网站,看看有什么好趋势将有助于您做得更好,这总是很高兴的。 在私人项目上工作很有趣,如果您坚持日常工作,您将学到一些东西。 不要犹豫,不要担心失败,开源将帮助您改善自己并评估自己的弱点并加以解决。

SOLID Swift:第一部分

什么是SOLID? SOLID是一组原则,简称。 父亲是(许多人可能认识他)鲍勃叔叔。 我听到您的问题: 什么是SOLID? 好问题。 SOLID由五项原则定义: 单一责任 打开关闭 里斯科夫替代 接口隔离 依赖倒置 在几篇文章中,您将了解他们的全部知识! 要记住的重要一点是,这五个原则不是严格的规则。 有时候,您会否决原则,并根据需要对其进行调整。 本文 总共将有三篇关于SOLID原理的文章。 这是第一个:这里将解释单一责任和开放/关闭 。 下一篇文章将讨论Liskov替代和界面隔离 。 上一篇文章将涉及依赖倒置,因为这是一个很大的主题,需要适当的解释。 单一责任 SOLID的第一个字母是单一职责 ,归结为确保任何类别仅具有一个职责。 例如:一个可以自己draw()并计算其area()的Rectangle类有两个职责。 无论您如何轻松地发现Rectangle类的两个职责,都可能很难发现。 当您有一个需要requestOrders() , parseOrders()和saveOrders()的OrderService类时,这样做可能很自然,但事实并非如此。 您能看出这堂课有多少责任吗? 至少三个:调用API,解析数据并保存。 您将要在这里划分职责。 您可以创建一个额外的OrderParser来解析订单,甚至可以创建一个带有save()方法的OrderDataSource 。 这样可以确保您可以更轻松地独立测试OrderParser , OrderDataSource和OrderService 。 使用Swift protocol实现时,您甚至可以在测试过程中切换出实现并完全控制。 最终,您可以在一个类中使用Service,Parser和DataSource(例如) 将来,当业务逻辑发生变化时,您还可以更轻松地创建任何协议的新实现。 例如,如果API从v1更改为v2,则可以轻松添加OrderV2DataSource: OrderDataSourceProtocol {}并逐步淘汰OrderV1DataSource 。 打开关闭 编写易于维护的类是打开/关闭原则的关键。 有两个条件: 可以扩展 :您应该能够轻松地更改或扩展类的行为。 已关闭进行修改 :您必须能够扩展类而不更改实现。 归结为编写不需要每次更改需求都必须更改的代码。 […]

Apple Watch App:显示心率

Apple Watch,健身应用程序,屏幕上的当前心率(bpm)。 简单的任务。 还是? Tl; dr :完整示例。 首先,必须创建一个观察者,因此每当HealthKit的心率数据发生变化时,都会收到更新。 创建心率的样本类型后,可以使用HKObserverQuery完成此操作。 奇怪的是-至少对我来说-这实际上并没有告诉您心率。 必须执行另一个查询才能检索最新的可用值。 该查询需要一个样本类型,谓词来定义日期间隔并进行排序以获取最新的日期间隔。 我使用了完成闭包,因此我们可以返回获取的值。 而且我们还没有完成…返回的数据无法显示,必须使用“计数/分钟”的HKUnit进行转换。 在此处查看完整示例。 我的意思是,它确实有效,但是单个数字就是80多行代码。

ReactiveSwift的Promise语法

使用闭包接收异步操作的结果 接收异步操作的结果已经很久了。 在iOS上,它以Delegate,Notification开始。 自从引入Objective-C的代码块以来,它已经演变为使用Swift的Closure。 特别地,闭包是功能编码的核心。 由于它的紧凑表示形式和基于编译器强大推断能力的各种简短公式,它也几乎用于Swift编码的各个方面。 使用Closure处理工作的结果有多种方法。 您可以考虑处理用户操作的结果,例如处理UI事件或处理警报选择结果。 此外,它可以在通过GCD执行异步操作后接收结果,也可以用于通过网络接收数据时的处理。 让我们考虑一下使用Closure调用Restful API之后接收结果的过程。 基本上,您需要一个闭包以在调用成功时接收结果,并需要一个闭包以在失败时接收错误。 您必须将两个闭包对象作为参数传递给调用Restful API的方法。 func getUserProfile(userId:Int,complete:(((JSON)-> Void),failure:((Error)-> Void)){ //成功调用成功,失败调用失败 } 这是最简单的思考方式。 然而,这种类型的封闭物递送和结果接收存在缺点。 上面调用getUserProfile函数的语法如下所示。 getUserProfile(userId:123,complete:{json in //成功动作 },失败:{error in //失败动作 }) 如果要将另一个状态的处理程序添加到getUserProfile,则不方便更改所有其他调用此方法的部分。 另外,如果将多个闭包作为方法参数传递,则不容易理解方法本身的签名,并且阅读起来也不那么好。 应用Promise语法 考虑一下JavaScript的承诺。 处理JS异步操作结果的传统方法是将Callback函数作为参数传递给工作函数。 但是,JS应用程序变得更加复杂,回调函数也变得更大。 同样,如果必须连续执行异步处理,则必须嵌套多个回调函数。 因此,它导致了代码难以阅读的问题。 解决这个问题的承诺已经出现。 可以将Promise对象传递给Task并为其添加一个Handler,而不是将Callback函数作为参数传递给work函数。 结果,诸如处理结果或执行另一任务的代码可以被添加为链。 这种方法解决了回调函数的缺点。 somePromise(task).then((result)=> { //做其他任务 })。then((result)=> { //结果处理 }) 通过上述链结构,一个函数只能包含与一项任务相关的代码,并且可以解决回调函数的嵌套问题。 在iOS开发中,闭包对象很少嵌套。 但是,在iOS中,如前面的示例中所述,类似的是,当将闭包作为函数的参数传递时,函数调用语法很复杂,并且很难修改签名。 因此,让我们创建一个类似于JavaScript的Promise对象,以改进用于异步处理的代码,并使用它来调用Restful API。 换句话说,我想向您展示如何通过以下语法使用getUserProfile。 […]

深入研究iOS音量控制

通常,我们有两种音量:一种是系统音频输出音量 ,当您点击iPhone侧面的音量增大/减小按钮时将显示该音量。 另一个是媒体播放器的音量 ,它表示您的Netflix电影或iTunes上喜欢的歌曲的音量。 在本文中,我们将尝试实现3件事情:隐藏系统音量控制,获取系统音量的值以及响应音量更改。 隐藏系统音量控制 从字面上看,隐藏控件的方法是从iOS系统中获取它,然后使其不可见。 这是执行此操作的示例代码: 请注意,我们无法将isHidden的isHidden设置为true,否则它不会隐藏系统音量控件。 此外,此示例代码不适用于模拟器,但适用于实际设备。 成交额 在iOS 9.0之后,获取音量值非常简单: AVAudioSession.sharedInstance()。outputVolume 响应体积变化 iOS有一个名为AVSystemController_SystemVolumeDidChangeNotification的通知,用于跟踪音量变化。 这是这样做的示例代码: 最后,您可以参考MPVolumeView官方文档以了解详细信息。