Swift是一种多范式编程语言,这意味着您可以进行面向对象,面向方面,过程,功能或弹出式编程。 仅举几例。 最后一个“ pop”表示面向协议的编程。 在WWDC 2015的本届会议上,一切都发生了变化,Dave Abrahams在会议上发表了关于这一概念和新思维方式的演讲。 他首先说: 新思维方式: 接下来的40分钟将搁置您通常的编程思考方式。 我们在这里要在一起做的事情不一定很容易,但是我向你保证,如果你坚持我的看法,那将是值得的。 如果您没有看过视频,我郑重建议您现在就观看视频。 因为我在本文中要做的就是分解同一段视频。 同年,Alexis Gallagher发表演讲,他试图解决使用快速编程语言使用关联类型时遇到的一些困难。 这不是一个容易理解的概念,Benedikt Terhechte撰写了有关此主题的文章,Russ Bishop也撰写了他的有关关联类型的回忆录,John Sundell也向关联类型致敬。 罗伯特·爱德华兹(Robert Edwards)详细介绍了类型擦除,李嘉诚(Lee kah Seng)撰写了有关如何在与协议相关类型一起工作时如何实现动态调度的发现。 他们都试图了解参数多态性是如何工作的。 令人讨厌的错误消息的美丽: 由于协议具有自身或关联的类型,因此只能用作通用约束。 每当您看到上述错误时,便会烦恼并开始粉碎键盘。 让我们确切地定义什么是关联类型。 关联类型的定义: associatedtype是未知Concrete Type的协议通用占位符,需要在编译时采用具体形式。 编译时与运行时的清晰度: 运行时和编译时是指软件应用程序不同阶段的编程术语。 编译时是将代码转换为可执行代码的实例,而运行时是转换后的可执行代码实际执行的实例。 关联类型的起源: 这个概念首先出现在“ 函数式编程杂志 ”上的出版物中, 该出版物的标题是: 泛型编程语言支持的扩展比较研究 。 他们着重强调多类型概念 ,这是Swift协议associatedtypes的根源。 Swift还从Scala的Traits和Abstract类型 , Haskell的多参数类型类中获得了一些启发。 以及Rust相关类型 。 然后,它将标准库中的“ 多类型概念”用于其集合类型。 关联类型解决的问题: 引入了associatedtype来解决丰富的多类型抽象问题,而后者在面向对象的子类型化中不可用。 设计用于解决已知的朴素generic protocol实现,尤其是在复杂性随通用类型引入增加而严重恶化的情况下。 保持静态类型安全,同时使语言更具表现力。 […]
开发人员熟悉三元运算符(或更确切地说是三元条件运算符)。 它不是特定于Swift的,而是许多编程语言中的基本运算符。 如何在Swift中使用它? 对于许多开发人员来说,“是这样还是那样?”,只要代码仍然可以编译并完成工作,这只是喜好和习惯的问题。 对我来说,这是一个有趣的问题,值得寻找答案。 首先,这是Swift.org上Ternary运算符的定义: 三元条件运算符是具有三部分的特殊运算符,其形式为question ? answer1 : answer2 question ? answer1 : answer2 。 这是根据question是对还是错来评估两个表达式之一的捷径。 如果question为真,它将评估answer1并返回其值; 否则,它评估answer2并返回其值。 三元运算符通过减少1个缩进级别来帮助使代码变平,因此有助于嵌套if -s来解决著名的厄运金字塔 。 例如,此代码 让持续时间:TimeIntervalif进度<0.2 { 持续时间= 1.0 }其他{ 持续时间= 2.0 } 可以通过使用此?:模式来以一种优雅的方式缩短 让持续时间:TimeInterval =进度<0.2? 1.0:2.0 整齐! 就个人而言,我喜欢在代码中使用此运算符。 每当需要分支时,我都想知道是否要使用三元运算符来实现。 但是,在某些情况下,我还是更喜欢 或switch 。 情况#1:当代码可读性受到损害时 三元运算符通常使代码更紧凑,但不应将其链接或嵌套。 我同意这样做时可以减少代码行,但那样可能会伤到你的眼睛(和其他人)🙂 假设我有一个名为BatteryLevel的枚举: 枚举BatteryLevel { 大小写无效 小写 案例中 情况高 } 现在,我要在其中添加一个初始化程序init(percentage: Int) […]
如果您的Swift项目在Linux上使用swift test ,则您知道需要运行swift test –generate-linuxmain才能免费获得在Apple平台上获得的东西,即。 让XCTest知道它运行哪个测试。 该命令会生成几个仅在Linux上使用的文件,如果要在CI中的Linux上测试产品,则必须将这些文件提交到存储库中。 毫无疑问,Swift的早期生活中有一个痛点,但现在仅仅是多余的样板。 差不多了,由于每次添加新测试时都必须重新运行该命令,因此很容易忘记,然后就无法在Linux上正确地进行测试。 因此,让我们添加一个CI挂钩即可。 使用Travis的构建阶段,很容易添加一个所有测试都依赖的阶段: #使用这些默认值,除非我们在各个作业中覆盖它们 操作系统:osx 语言:迅捷 osx_image:xcode10.1 工作: 包括: -阶段:预测试 名称:检查Linux测试是否已同步 安装:快速测试–generate-linuxmain 脚本:git diff-退出代码 -阶段:测试 名称:macOS / Swift 4.2.1 脚本:快速测试–parallel -信封:SWIFT_VERSION = 4.2.1 操作系统:Linux 名称:Linux / Swift 4.2.1 语言:通用 安装: 评估“ $(curl -sL https://swiftenv.fuller.li/install.sh)” 脚本:快速测试–parallel 预测试很简单,我们运行swift test –generate-linuxmain ,然后询问git是否存在差异。 如果存在任何差异,那么我们(或贡献者) swift test –generate-linuxmain在提交之前忘记运行swift test –generate-linuxmain 。 自动化运行swift […]
Swift Island的第一版于2018年7月4日至5日在荷兰的Texel举行。 Marino Software非常高兴能送我回去参加这次会议。 “ Swift Island是一次全面的实验性会议,在Apple的WWDC 2018之后一个月举行。” — swiftisland.nl/#about 为了克服WWDC之后的局面,尼尔斯和西德尼在WWDC举行一个月后召开了一次会议,讨论那里宣布的所有新事物。 设置非常简单。 八名导师在两天内讨论了八个主题。 您每天要做三个工作坊,所以您不会错过太多。 我真的很喜欢这种设置,因为在大多数会议(包括WWDC)上,您都错过了很多演讲。 研讨会不仅是讨论新事物的导师,我们还与导师一起积极编程。 因此,它非常实用。 这种方法非常适合我,当您一起工作时,您会学到更多东西,并就所卡住的东西提出问题。 如前所述,有八个工作坊可供选择。 全部由经验丰富的导师提供。 Siri捷径,作者Daniel Steinberg Meghan Kane的机器学习 其余最好的-Roy Marmelstein撰写的其他新iOS12框架 Kate Castellano和Manu Rink的ARKit 2(入门级和高级) 乐器+建立自己的乐器Donny Wals Marijn Schilling的游乐场 斯威夫特的秘密动态生活,大卫·哈特(David Hart) 我选择去Siri快捷方式,机器学习,动态Swift,ARKit 2(两者)和乐器。 我不会详细介绍所有研讨会,但是我将介绍主要的收获。 如果正确使用,Siri快捷方式对于应用程序将是非常方便的功能。 您可以使Siri可以使用快捷方式来执行用户在应用程序中执行的操作。 银行应用程序中的快速平衡,编写新推文或检查一个巴士站的实时信息(提示都柏林巴士)。 随着时间的推移,Siri将在何时何地使用这些快捷方式进行学习,以便仅在您需要它们时才可用。 请确保仅将它们用于在您的应用中经常发生的操作,因为否则您将充斥Siri建议页面并造成不良的用户体验。 在这些工作坊中,我了解了Swift 4.2中的一项强大新功能@dynamicMemberLookup。 根据Swift-evolution提案: 枚举JSON { 大小写StringValue(String) 大小写DictionaryValue(Dictionary ) }扩展JSON { var […]
基于mpv,可在macOS上提供最佳解码能力 专为现代macOS(10.10+)设计,旨在提供最佳的用户体验 视频,音频,字幕,播放列表,章节等所需的所有功能。 强制触摸,画中画和(高级)Touch Bar支持 精选的iOS框架,库,教程,Xcode扩展和插件,组件等等的精选列表。 该列表分为几类,例如框架,组件,测试和其他,开源项目,免费和付费服务。 每个类别中没有预先确定的项目顺序,该顺序是用于贡献的。 如果您是计算机科学专业的学生,需要学习这些东西以进行考试–或者您是一个自学成才的程序员,并且希望重新学习您的手艺背后的理论,那么您来对地方了! 该项目的目的是解释算法如何工作。 重点是代码的清晰度和可读性,而不是制作可放入您自己的项目中的可重用库。 就是说,大多数代码都应准备好用于生产,但是您可能需要对其进行调整以适合您自己的代码库。 Rx是通过Observable 接口表示的通用计算抽象。 这是Rx的Swift版本。 它尝试从原始版本中移植尽可能多的概念,但对某些概念进行了改编,以便与iOS / macOS环境进行更愉快,更高效的集成。 Vapor是Swift的Web框架。 它为您的下一个网站,API或云项目提供了精美而易用的基础。 很棒的Swift库和资源的协作列表。 随时贡献! 可链接的请求/响应方法 URL / JSON / plist参数编码 上传文件/数据/流/ MultipartFormData 使用请求或继续数据下载文件 使用URLCredential进行身份验证 HTTP响应验证vv Material的动画系统已被完全改编,以利用Motion(专用于动画和过渡的库)的优势。 一些功能: 完全可定制 运动动画和转场 自动版图和网格系统的版图工具 颜色库 牌 英雄类似于Keynote的Magic Move。 它检查所有源视图和目标视图上的heroID属性。 然后,每个匹配的视图对都会自动从其旧状态转换为新状态。 Hero还可以为无与伦比的视图构建动画。 通过heroModifiers属性很容易定义这些动画。 Hero将与Magic Move动画一起运行这些动画。 所有这些动画都可以通过用户手势进行交互控制。 Eureka允许我们指定何时应该评估验证规则。 我们可以通过设置validationOptions行的属性来实现,该属性可以具有以下值: .validatesOnChange —每当行值更改时验证。 .validatesOnBlur —(默认值)在单元格退出第一响应者后立即验证。 […]
你好! 我敢肯定,你们大多数人都遇到了至少一个如此巨大的视图控制器,以至于您甚至都无法搜索到想要的东西。 或更糟糕的是,您可能会发现大多数具有tableView(或集合,具有数据源的任何东西)的控制器都执行相同的操作……获取数据,修改数据,更新视图,重复…… 我们一直在这样做, 如果您在每个视图控制器中执行所有操作,则它们可能是0%可重用的 。 图表 这是普通表格视图控制器的示意图: TableViewController向dataSource询问数据。 dataSource有一个适配器 , 将我们的tableView 绑定到我们的数据。 适配器具有一个可观察的元素数组,因此在更新时,适配器会收到通知,并且tableView更新。 注意:我没有为此使用任何外部库。 可观察的 首先,我们的可观察集合将基本上遵循以下协议: ObservableCollection协议 从这里,您可以猜测会有一个动作( ObserverAction )用于我们对集合所做的“所有”操作(追加,删除等),因此,观察者将在那里绑定动作。 我为数组创建了一个简单的observableArray ObservableArray ,这是我们将在本示例中使用的数组(类和整个项目都在最后链接)。 为什么可观察? 看看为我们所做的一切添加一些观察者是多么容易: 适配器-将视图绑定到我们的数据 接下来是创建我们的适配器,它可以符合: 公共协议ComponentAdapter { relatedtype组件:UIView relatedtype元素:集合 } 我们可以创建一个符合此协议的TableViewAdapter 。 在这种情况下,该组件将是UITableView 。 基本上,我们拥有我们的视图以及要将其绑定到的数据。 使用我们的可观察数组,绑定过程非常容易。 在适配器的init方法中,您可以执行以下操作: 如何使用Adapter类中的ObservableArray将数据绑定到组件 数据源 表格视图控制器将绑定到一个数据源 ,这是一个符合UITableViewDataSource的自定义数据源 ,它具有一个适配器 ,用于在源和UI级别管理数据中的更新 。 在自定义数据源中,我们使用tableViewAdapter 在内部,我们实现了典型的方法: numberOfRowsInSection , cellForRowAt indexPath以及其他一些方法,可通过滑动单元格或仅将行移动到其他位置来删除它。 例如,这是移动一行的全部代码 : […]
预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIBarButtonItem https://developer.apple.com/reference/uikit/uibarbuttonitem UINavigationController https://developer.apple.com/reference/uikit/uinavigationcontroller UIViewController https://developer.apple.com/reference/uikit/uiviewcontroller 快乐编码😄
我们的应用开发者博客上的新故事涵盖蒸气:这是什么? 新版本3.0.0对iOS开发人员意味着什么? Vapor是iOS和后端开发人员遇到麻烦的结果,因为他不得不在Swift和后端脚本语言之间切换。 从完成之日起,Vapor解决了许多iOS开发人员和后端开发人员的问题。 根据Vapor的创建者之一Tanner Nelson的说法,该框架提高了Swift开发人员的效率和生产力,并减少了他们可能面临的权衡取舍。 这是对他思想的快速描述: 来源:领域 对于后端开发人员,您可能会认为它是“幸福或生产率与效率或性能的关系”图。 Swift和Vapor在这种情况下是最好的一对。 您是否已经喜欢Vapor还是对您来说仍然是个谜? 对于上面问题中提到的两种类型的开发人员,本文都可以提供帮助。 在本文中,我们介绍了Vapor,其最新版本Vapor 3.0.0,以及iOS开发人员为什么应该考虑了解它(并因此使用它)。 什么是蒸气? 是什么使它成为Swift最常用的框架? 正如Swift是开源的一样,Vapor在2016年1月也被Tanner Nelson和Logan Wright引入为开源许可软件。这是使用Swift构建的最强大,最完美的框架。 Vapor基于SwiftNIO的非阻塞和事件驱动架构,以及面向协议和表现力的设计,使其成为iOS和Swift开发人员值得学习的模块化框架。 Vapor利用Codable进行HTTP消息数据的解析和序列化,创建DB模型和呈现视图。 该框架也支持Xtensible标记语言。 正是由于其出色的可用性和性能,Vapor是目前最常用的服务器端Swift框架。 蒸气释放3.0.0:蒸气中有什么新功能? Vapor的创建者花了很长时间才提出框架的3.0版本。 原因是-他们忙于提高代码的健壮性,优化代码,添加新模块以及准备冗长且有用的文档和API文档。 简而言之,在最新版本的Vapor(即3.0)中,所有内容都是新的。 Vapor 3.0为Swift 4的Codable-Standard Library带来了完整的本机支持,从解码到访问数据以及读取查询,几乎都在使用它。 现在,Vapor在SwiftNIO上运行。 Vapor 3.0.0的主要功能是: 异步 它解除了对Vapor 2的限制,并切换到完全非阻塞机制,这是一种异步方法,与以前版本的Vapor不同。 通过采用异步通信方法,可以处理超高并发性。 因此,您的应用程序的性能可以比Vapor先前的版本更好。 服务 “ 服务 ”是全新的依赖注入框架,完全在Swift中构建。 因此,此版本可以同时处理多个请求。 通过减少系统资源的使用,提高了服务器的响应速度。 蒸气模块禁止使用JSON配置文件。 令您惊讶的是,Vapor框架每秒可处理12万个请求,胜过Perfect,Gin,Kitura,Express等。 改进的数据库支持 在Vapor 3.0中改进了数据库支持。 在此版本中,维护并提供了SQLite,Redis,Postgres和MySQL的官方驱动程序。 套餐变更 现有软件包中有许多更改,并且推出了一些新软件包。 可编码 随着整个蒸汽使用Codable,该框架的性能得到了极大的提高。 […]
如果您曾经尝试过建造快速的游乐场,那么您会知道这项任务多么艰辛和令人讨厌。 您不知道出了什么问题,必须一直为您的ipad发送时间,或者等一千分钟直到icloud重新加载它。 如此艰难,以至于我和我的朋友们首先习惯于首先创建一个xcode项目并将所有内容放入其中。 所以,要感谢苹果的时间: 狗的日子结束了! 为什么? 看看:Swift Playgrounds作者 因此,如果您想快速使用这个出色的工具,只需保留此页面即可! 为什么? 作者模板的工作就像魔术一样:您可以构建,测试它,还可以使用运动场语言(实时视图等)调试运动场。 当它准备就绪时:它就可以建造了,您的游乐场将在iPad上完美完成,就像馅饼一样简单! 怎么样? 首先:在苹果网站上下载该项目:Swift Playgrounds Author Template 顺便说一句,我不是要教如何使用,而是要说我在使用时学到的技巧。 1)了解结构 它的结构看起来像xcode和游乐场书籍的结合。实际上就是这样! 老实说,我并没有仔细说出一切,但如果您想了解更多..可以免费在Google上搜索。 运行项目重要的是什么? a)清单-在清单中,您将在其中告知游乐场的基本信息,例如名称,页数等。 b)源代码-在源代码中,您将放置类,例如视图控制器,类…… c)私人资源-这里将包含支持文件,例如图像,情节提要,XIB,Sceneview,音频…… d)章节-如果您已经写了一本操场上的书,那么您会知道这里是文本,尽管该平台在很大程度上发挥了作用 e)章节-最后但仍然很重要的产品,您很快就会了解更多! 2)保重! 上面的图像是此运动场模型中的一个类。您一定不要忘记让重写或委托功能处于公共模式。 如果您这样做,那么构建器将抱怨并要求您将其更改为私有,但委托将无法工作。 另外,请注意,在开始时我添加了此objc行,以便让他们知道我的类在项目中的位置:另一个“您一定不能忘记”的地方! 3)在目标! 如果您从未与多个目标合作过,也许会有些困惑,但是喘口气,我知道您可以做到! 在这个项目中,您有三个不同的目标: a)游乐场书-这将是您工作的结果:游乐场书,但让我们将其保留下来以作为结局 b)书籍来源-顾名思义,这个目标是您的来源,有点令人困惑,但是当我们检查成员资格后,您会明白的 c)书本来源-有用的目标! 有了这个,我们就可以运行,调试并在游乐场中做我们想做的一切 现在您已经了解了每个项目的一点点,应该将正确的目标成员资格添加到项目的每个源中,如果您从未这样做过,那么只需选择存档并打开检查器即可: 那么每个归档文件属于哪个目标? a)来源->图书来源 b)私有资源:私有资源通常是视听内容,这意味着如果您希望将其保留在书中,然后选择PlaygroundBook成员资格,LiveView目标也会发生同样的情况,如果您不标记成员资格,则源不会可用..这就是为什么对我来说不合理的原因是不将所有内容都标记为成员身份,但这取决于您🤷♀️ (显然来源除外) 4)建筑和大决赛 现在,您编写了没有错误的代码,并且想要尝试看看行为是否正常。 测试就像在普通的xcode中一样:cmd + r 当然,您必须选择正确的目标:实时显示测试: 选择实时取景,然后等待其在iPad中运行! 大决赛 必须告诉真相:我写了这整件事,等待这一刻! 现在是时候让您的所有代码成为一本真正的游乐场书,并向您的小侄子展示您的惊人项目了。 但是,为什么要大结局呢? 因为它是如此简单,以至我以为是谎言。 […]
测试具有外部依赖关系的控制器(尤其是涉及HTTP请求的控制器)非常棘手。 那是因为发送实际的请求会创建一个您不能依靠的测试,并且测试非常缓慢。 但是,您可能熟悉一种非常简单的技术:使用协议并将依赖项注入控制器。 最近,当我尝试从单元测试中的路由获取参数时遇到了一个问题。 因此,今天我想向您展示如何在Vapor 3中轻松传递正确的路线到测试功能。 让我们开始吧🚀 您为什么还要测试控制器? 🤔 想象一下一个在线商店。 在“产品详细信息”页面上,用户可以检查有多少可用商品。 问题是可用性系统是一项外部服务,因此,每当用户想要检查产品状态时,都必须调用外部服务。 由于外部服务可能已关闭或用户正在寻找的物品不再可用,因此控制器必须返回正确的信息。 模拟外部依赖dependencies️ 您无法检查外部服务是否正常运行,但是可以通过模拟外部服务来检查控制器是否正在返回正确的状态代码。 您可能之前已经做过,但很简单: 使用协议进行外部依赖 将其注入控制器内,例如: init方法内 在测试套件内部,使用符合协议的模拟对象 让我们定义一个简单的协议— AvailabilityCheckerProtocol : protocol AvailabilityCheckerProtocol { func checkProduct(id: UUID, quantity: Int) throws -> ProductDetailsResponse var req: Request? { get set } } 我添加了var req: Request? 只是因为它很容易使用client().get()方法并从实现内部的外部服务获取状态,所以使用该协议。 现在创建一个具有checkAvailability功能的控制器: import Vapor import Foundation final class AvailabilityController { […]