Tag: swift

可编码—改进解码JSON的4种方法

Swift 4中引入的Codable提供了一种方便,轻松的方式来编码和解码JSON。 但是,并不是所有的东西都开箱即用。 Swift 4中引入的Codable提供了一种方便,轻松的方式来编码和解码JSON。 但是,并不是所有的东西都开箱即用。 例如,让我们看一下Twitter中的JSON文件。 作为JSON解码器工作方式的结果,我们看到: 引用和标准推文使用相似但不完全相同的字段。 转换为属性名称的键不遵循Swift约定。 日期不是采用标准的接受格式。 颜色的格式不受任何Color类 (UIColor,NSColor等)接受。 因此,我们将学习如何为某些特殊情况设置您的Codable类型。 具体来说,我们将研究: 对可编码类型使用协议 不同的属性名称和键 属性值中的日期 自定义类型的属性值 要继续学习,您可以在GitHub上查看本文的Xcode游乐场。 JSONDecoder的工作方式 这些是JSONDecoder如何将JSON转换为结构化类型的基本规则: 属性名称按原样转换。 默认情况下,简单属性值将转换为String , Int或Double 遵循正确格式的属性值可以解码为URL , Data或Date 。 任何属性值都可以认为是Optional 方括号[]值将转换为Array 花括号{}值将转换为Dictionary或自定义类型。 所有需要解码的类型都需要实现Decodable协议。 同样,需要编码的类型需要实现可编码协议。 如果需要同时对类型进行解码和编码,则可以简单地实现Codable。 在这种情况下,我们将查看为一条推文返回的Twitter JSON数据。 因此, 我们要做的第一件事就是为每种返回的数据类型创建一些基本结构 。 结果,您可以在仓库的此分支上查看解码工作的第一步。 即使数据相似,我们也会创建单独的结构以提供更大的灵活性。 但是,这并不意味着我们不能使用协议来简化功能中这些类型的使用。 将协议与可编码一起使用 例如,在Twitter API中,始终使用tweet的概念。 举例来说,他们的JSON有一条主推文和一条引号 。 因此,可能倾向于对两者使用相同的结构。 但是,更好的方法是两个单独的结构: public struct Tweet:可编码{ public […]

RxSwift研究组-第1部分可观察到的

这是RxSwift学习会系列文章第一篇,文章编排与架构方式可以参考前言。 关于RxSwift 首先,RxSwift可以说是Swift中的响应式编程 。Swift就是一个程序语言,响应式编程是从哪里来的呢? Microsoft有一个团队,他们为了解决异步造成的程序代码混乱,难以规范化,以及开发App遇见见的困难,他们决定开发一个库来解决这些问题。 2009年这个团队推出了一个客户端和服务器端框架,称为.NET(Rx)的反应性扩展 ,就是后来有人常讲的Rx库。 很快的这个框架就从外挂(.NET 3.5)变成内建核心库(.NET 4.0)。他们在2012年将这个框架开源,让不同的程序语言也可以做出自己的Rx库—这让Rx变成跨平台的标准。 因为Rx生态圈蓬勃发展,今时今日我们有许多不同语言都有Rx Library,实作一样的行为跟提供一样的API ,这让使用Rx的开发者,可以跟不同程序语言的开发者(例如,使用RxJS写web的人)讨论逻辑 。 举例来说,Rx文档中清楚定义了许多operator的名称与功能,其中一个叫做merge,而不同语言的Rx Library有实作这个merge operator。讨论某个资料处理的逻辑时,说出“把a跟b merge起来然后怎样怎样…”这种句子时,两个人都可以充分理解彼此在说什么😎。 因此可见,反应性编程其实已经存在很久了,不是一个新的东西,但它的核心概念让它在最近十年又开始备受瞩目。据Raywenderlich推出的这本书,RxSwift的定义为: RxSwift是一个库,用于通过使用可观察的序列和功能样式运算符来组合基于异步和事件的代码,从而允许通过调度程序进行参数化执行。 但我们可以抓出几个关键字 目标:基于事件的异步代码 方法:可观察的序列,函数样式运算符,用于参数化执行的调度程序 简单来说,Rx的核心概念就是使用Observable Sequence + Functional Style Operator + Scheduler,把原本的代码变成基于事件的代码,解决异步造成的混乱。 问题一:异步造成了什么混乱? 在原本的设计中,ViewController同时要处理来自不同东西的异步事件。事件源包含委托,数据源,通知中心,GCD,关闭…等。无法有统一的管理方式,你经常会不晓得其中一个异步事件会先被触发。 问题二:Rx如何处理? 可观察序列可以将异步的结果变成一个事件。当我们需要处理异步时,只需要依据这个事件。 将来自不同地方的异步结果,用一致的概念包装起来,独立,逻辑清晰集中,跨平台都可以理解。这就是处理异步时最理想的状态,而不需要使用一大堆观察者模式像是KVO,通知,关闭,委托…等等,另外容易搞清楚先后顺序,在跨平台理解上门生物学也比较高。 如何把异步变成可观察序列呢? 以UI元素来说 系统状态 举例说明: 从API捞回最新的商品资料,依据价格高低排序后,从台币转换成美金,四舍五入取小数点后两位,更新UI。 一般写法 code顺序混乱,权责不清楚,在API中处理资料转换 可观察序列+函数样式运算符+调度程序改写 先改写APIManager 再改写ViewController 顺序,逻辑,分工清楚 可以抛光来,我们的逻辑变得一致且集中了!

使用MVVM使UITableView和UICollectionView更轻便

有时,同时使用UITableView和UICollectionView会导致膨胀的视图甚至是控制器。 当我们需要动态更改数据类型时,事情变得更加复杂。 可以说我们有如下两个部分: 在屏幕下方,有两个单独的部分,这意味着我们需要两个单独的模型,并且这两个模型是一致配置的。 如果选择“订单”,则必须使用“订单”模型在表格视图中准备单元格。 相反,当我选择“已完成订单”时,我还必须在表格视图中准备带有相关模型的单元格。 对于这种情况,我创建了两个不同的模型,第一个模型用于活动订单,第二个模型用于完成的订单,例如 对于这种情况,分离数据源会更加有益。 我们不应该将数据源文件重新使用到同一应用程序中。 相反,我们应该按表和集合视图创建数据源。 这样,我们可以测试我们的视图模型,模型甚至数据源! 为了使我们的模型不可变,我使用struct而不是class。 我的ViewModels现在有非常简单的工作。 我们的数据源仅实现UITableViewDataSource或UICollectionViewDataSource 最后,我们的视图控制器只做一件事; 在视图和视图模型之间进行调解! 通常,我们应该保持视图控制器的亮度。 这样,如果我们可以对视图模型进行单元测试,则可以增加我们的测试覆盖率和应用程序关联性,并执行一点SRP(单一责任原则)规则。 如您所见,我的视图控制器仅执行与视图相关的工作。 就像将我的数据源类绑定到表视图中一样。 当采用这种方法使red-green-refactor标准变薄时,我们可以测试几乎所有的业务逻辑。 我们可以像我之前说过的那样测试模型,查看模型甚至数据源。

iOS App Swift初学者,带有示例应用程序,架构简洁

Clean Swift或Clean Architecture是适用于iOS和Mac项目的体系结构。 Clean Swift体系结构不是框架。 它是一组Xcode模板,可以为您生成Clean Architecture组件。 这意味着您可以自由修改模板以适合您的需求。 因此,如果我们要更改某些内容,则它不会影响其他文件,因为它基于图层。 Swift是用于macOS,iOS,watchOS和tvOS的功能强大且直观的编程语言。 编写Swift代码是交互式且有趣的,语法简洁而又富有表现力,并且Swift包含开发人员喜欢的现代功能。 Swift代码在设计上是安全的,但也可以生成运行闪电般快的软件。 Swift已经支持所有Apple平台以及Linux,社区成员正在积极努力移植到更多平台。 传统建议使用新语言的第一个程序应在屏幕上打印“ Hello,world!”字样。 在Swift中,这可以单行完成: 打印(“你好,世界!”) Swift语法类似于C或Objective-C。 在全局范围内编写的代码用作该程序的入口点,因此您不需要main()函数。 您也不需要在每个语句的末尾写分号。 使用let来使常量或var来使变量。 常量的值不需要在编译时就知道,但是您必须为它赋值一次。 常量或变量的类型必须与要分配给它的值的类型相同。 var myVariable = 42 myVariable = 50 让myConstant = 42 使用SnapKit的Swift SnapKit具有清晰简洁的API,可轻松编写代码中的约束。 所以 安装 我们将使用CocoaPods安装SnapKit。 CocoaPods是Swift和Objective-C Cocoa项目的依赖项管理器。 它拥有超过51,000个库,并在超过300万个应用程序中使用。 CocoaPods可以帮助您优雅地扩展项目。 #Xcode 8 + 9 $ sudo gem install cocoapods 然后在Xcode项目目录中,打开位于项目目录位置的终端并输入: 荚初始化 然后在项目目录中,您将看到一个需要添加的podfile: 吊舱“ […]

可编码

快速浏览XCode 9和Swift 4的详细信息。 JSON格式的可解码和可解析的JSON格式的可转换代码。 Es bastantefácilde usar可以使用cquiquier arquitectura。 1.¿可编码和可解码吗? 可编码的无定形变换是一种外部代表性的变换。 JSON格式的转换对象。 易腐烂的,可变形的和不透明的代表。 JSON和JSON的可解释性。 2.,可编码吗? 前可编码的简单编码。 可编码和可解码的可实现的Cucando实现方式 typealias可编码=可分解和可编码 3. Objeto可编码 结构体枚举的可编码的实现类 。 Para formar un objeto可编码partiremos del siguiente JSON: [ { “ firstName”:“ Alvaro”, “ surName”:“ Royo”, “ alias”:“ FreeWorld”, “年龄”:22, “身高”:1.8 }, { “ firstName”:“ Nacho”, “ surName”:“García”, “年龄”:26, “身高”:1.84 } ] Y crearemos un […]

创建自己的功能标记服务(iOS示例)

首先,我要说的是,这里有很多很棒的平台,它们的软件比这还先进,并且这可能不是每个人的完美解决方案。 这是一个易于实现,免费且易于实现的解决方案,但代价是缺少功能和用户友好的仪表板。 什么是功能标志? 最简单形式的功能标志只是给定键的true或false值。 功能标记通常用于测试项目中的新功能,因此使用前缀“功能”。 想像一下您有一个应用程序,并且想要启动一个全新的主页,但是由于它的功能很大,因此存在很大的风险。 如果您可以完全支持这两种方法,直到知道新的方法稳定下来,而不是完全替换它,该怎么办? 使用功能标志,您可以执行此操作。 例如,当用户启动应用程序时,您可以检查是否启用了新的首页功能标记。 如果是这样,请加载新主页,否则加载旧主页。 我的应用很小,用户很少,我是否还需要使用功能标志? 没有快速答案。 这实际上取决于您的项目和项目要求。 就我个人而言,我是一个狂热的粉丝,但是这篇文章不是关于为什么的论据,而是关于如何做的论据,所以让我们开始吧。 第1部分:配置 为您的项目创建功能部件标记服务分为3部分。 这是第1部分,涵盖了我们将在客户端内进行交互的配置文件。 由于它的灵活性和可读性,我们将用JSON编写此配置文件。 在编写此文件之前,让我们确定该文件的要求: 密钥:这将是我们在客户端中引用以获取布尔值的标志的名称。 启用:这是一个布尔值,告诉客户端是否启用了该标志。 这就是我们所需要的。 如果愿意,我们可以添加更多字段,例如名称和描述,但是为了本教程的缘故,我们将使其简短而切合实际。 让我们创建我们的config.json文件: 第2部分:主持人 这部分是您可以选择的地方。 在本教程中,我仅涉及该文件的公共访问。 我可能会做有关如何私下托管它的其他教程,请告诉我您的想法。 选项1:Github 一种选择是将该文件托管在公共GitHub存储库上或公共GitHub gist上。 这是我最喜欢的方法,因为GitHub提供了GUI来编辑文件,因此随时可以轻松更新。 选项2:您的域 另一种选择是将其托管在您自己的网站上。 然后可以通过http://yourdomain.com/config.json访问它 第三部分:客户 对于此示例,我们将在Swift中构建客户端。 请注意,在Swift中有多种方法可以进行网络通话。 为了本教程的缘故,所有标志都被提取并存储在本地(提取完成后会触发通知)。 如果您在第一次调用之前尝试获取,则所有标志都将返回false。 首先,首先创建一个新的Swift文件,并将其命名为“ FeatureFlagClient.swift” 这就是我们的客户端配置。 让我们学习如何使用它。 在您的应用程序委托中。 使用新的config.json端点配置新的FeatureFlagClient 。 现在,要检查功能标志的值,请使用以下命令: FeatureFlagClient.isFlagEnabled(“ new-feature-1”) 开始的结尾 这只是功能标记之旅的开始。 它们非常强大,并具有大量更高级的用例,例如A / B测试等。

iOS自动版式和堆栈视图

自动布局是一项强大功能,可为iOS平台构建可调整大小的动态用户界面。 但是,要解决在屏幕上布局多个视图的众多限制,就带来了极大的复杂性。 使用堆栈视图来节省麻烦很方便。 堆栈视图允许以水平或垂直方式在堆栈中布局视图。 提示:增强您的Xcode🎨 为了演示起见,我使用堆栈视图和自动布局的混合与匹配构建了一个计算器应用程序用户界面。 遵循的步骤: 1)创建一个单视图项目 2)在视图控制器上添加标签,然后使用编辑器>嵌入>堆栈视图或底部的按钮将其嵌入到堆栈视图中 3)现在添加20个按钮(5行4列) 4)将按钮的每一行插入堆栈视图中。 您也可以命名堆栈视图以进行识别 5)选择所有堆栈视图,并将它们嵌入另一个称为“根堆栈视图”的堆栈视图中。 现在我们有了堆栈 6)选择“根堆栈视图”,然后为零,(0)的标准值添加4个约束,分别用于顶部,左侧,底部和右侧。 7)对根堆栈视图执行以下操作: 设置根堆栈视图填充的对齐方式 将“根堆栈视图”的间距设置为8 px iOS标准 将分布设置为均等填充 8)对所有子堆栈视图重复步骤7。 是的,您快到了! 9)似乎自动布局会留下一个小的警告。 通过选择警告来修复它并更新其框架。 现在可以使用计算器布局了。 它可以在所有屏幕尺寸和方向上流畅运行。 ‍🚒 下载完成的项目

与Fastlane和Bluepill并行运行XCUITests

注意:Apple已发布了Xcode 9的并行测试功能,因此,本文中提到的Bluepill工具现在意义不大! LinkedIn最近开源了Bluepill,该工具可以并行运行iOS测试。 在LinkedIn工程博客上有Bluepill公告博客文章。 Bluepill并不从头开始支持Apple的XCTest和XCUITests框架,但是在最新版本v1.0.0中,我们可以使用Bluepill并行运行XCTest和XCUITests。 蓝丸功能 Bluepill具有一些很棒的功能,您可以在Github README上阅读全部详细信息,但总而言之,我们可以 与多个模拟器并行运行XCUI测试。 将测试分散到多个模拟器中,并允许以无头模式运行测试。 每个模拟器生成报告并重试失败的测试。 蓝丸限制 除了一些出色的功能,Bluepill还具有一些局限性,如下所示 Bluepill的安装过程很痛苦。 用户必须从Github手动下载二进制文件或下载源代码并构建框架以获取二进制文件。 理想情况下,它应该是像Homebrew一样的软件包或其他软件包管理系统,以使安装变得容易 有两个二进制文件“ bluepill ”和“ bp ”,运行测试需要同时进行。 目前,“ bluepill”二进制文件具有用于自制程序包的公式,但是“ bp”二进制文件没有任何公式。 Bluepill遍历了测试目标,但是可能存在更快的方法来解析.xctestrun文件以找到测试。 TravisCI构建长期未维护为红色。 Bluepill缺少用户文档。 撰写本文时,github上的文档目录仍然为空。 希望LinkedIn的Bluepill团队将在不久的将来为解决这些问题做出一些努力。 蓝丸和Fastlane婚姻 根据github上当前的Bluepill使用情况信息,我们必须使用xcodebuild’build for testing’操作通过XCTest构建应用方案,以便我们可以派生数据以与Bluepill一起使用。 然后,我们可以将’app_path’,’scheme_path’,’output_directory’和其他标志传递给bluepill以并行运行测试,或者使用配置有这些标志的use JSON文件将其传递给bluepill。 通过与Fastlane结合使用,我们可以使此过程更加动态,Fastlane是用于自动执行iOS开发任务的工具。 在这篇文章中,我们将看到如何配置Bluepill与Fastlane一起运行! 设置Xcode项目 让我们开始在Xcode中创建一个名为“ Single View Application”的新iOS项目,并将其命名为“ Bluepillar”,同时选中“ 包括UI测试”框。 不要选中“ 包含单元测试”或“将此示例使用核心数据 ”复选框。 现在,Xcode为我们生成了项目模板,让我们复制模板UI测试六次将其命名为OneBluepillarUITests.swift,TwoBluepillarUITests.swift等等。 不要忘记相应地更改类名。 在此阶段,我们的Xcode项目应如下所示: 现在,我们有六个测试在做相同的事情,但是对于并行测试演示来说,这无关紧要。 安装Bluepill 当前,我们可以通过运行以下命令使用Homebrew安装Bluepill $ brew安装bluepill […]

MediaPicker是iOS中的所有选择器

嗨,大家好。 今天,我有一份与在iOS应用程序中访问文件有关的工作。 因此,我在Google,堆栈溢出,中等博客等方面进行了研究。 我遇到了一个博客,该博客写了关于如何在相机中拍照或在iOS应用程序中访问图像的方法,然后阅读了。 我认为,如果我使用它来选择iPhone或iPad中的许多类型的文件,那也许很棒。 所以我写了这个模块,需要公开这些知识。 我们开始做吧!!!! 第1节: 通过使用名称“ MediaPicker.swift”在Xcode Project中创建文件。 第2部分: 声明的类名称为MediaPicker。 导入UIKit 导入MobileCoreServicesclass MediaPicker:NSObject {//继承NSObject} 第3部分: 按照名称“ MediaType”创建枚举,以用于要使用的文件的句柄类型以及您可以编写的基本类型,如下所示。 枚举MediaType {案例图片案例媒体案例全部} 第4节: 通过名称“ Constants”创建新的Struct,以用于定义每个事件或按钮的名称,并使用户易于理解。 在现实生活中,通过“常量”可以存储字符串,文本,措辞等……它的好处是您需要存储1值并在许多控制器中使用(假设值是“测试”)。 如果您不存储在“常量”中,则必须在许多控制器中编写“测试”,但是如果您像Thanos那样坚强,那就没关系了。 没关系,你是否像Thanos一样坚强哈哈。 糟糕,要编辑此值吗? 你好吗? 您必须在编写的每个控制器中进行编辑。 你累了吗? 我一直强调自己,我必须在“常量”中写一个常量值。 好吧,加油! 该“常数”的价值如下。 struct常量{static let camera =“ Camera” static let gallery =“ Gallery” static let video =“ Video”静态let file =“ File”静态let cancel =“ […]

Swift — memoize()逐步

最近,我一直在阅读有关Swift 3未来的文章。 对在服务器上使用Swift以及在该方面完成的工作特别感兴趣。 迅捷轨迹🚀 Swift具有巨大的潜力,可以成为构建从VR到移动到服务器再到AI 的主流语言。 仍然缺少一些关键的构建块,但已经奠定了坚实的基础。 其中,可以说是最重要的功能支持 ,从第一天开始就随语言一起提供。 功能迅捷 语言结构很好地表达了功能支持,这使得一些疯狂的热门功能实现成为一个例子,其中一个示例就是在WWDC’14 Session 404 – Advanced Swift中引入的备忘录功能(讨论从00:38开始)。 在这篇文章中,我希望探讨memoize的性质并解释其工作原理,将其从WWDC’17的“高级”轨道移至“基本”轨道。 记住 乍一看, memoize’s实现看起来像Brainfuck启发的Hello World,但请放心-它是Swift。 纯功能性Swift😼 步骤2:递归记忆 为什么此版本的memoize是递归的要点是,将工作闭包作为参数传递给它自己 ,这使工作闭包可以对自身的memoize’d版本进行递归调用。 这有资格获得令人赞叹的史诗般的胜利🎆 14号线 使用尾随闭包语法,我传递了2参数工作闭包以进行memoize. memoize的结果(环绕式闭合)存储在名为factorial的参数中。 从工作闭包体内 对 factorial(x-1) 的调用 是指传递给闭包的参数,它与 let factorial 命名 完全无关 。 15号线 let factorial类型为(Int) -> Int 推断输入Int是因为发现Int Type符合以下要求: 1.符合Hashable协议。 2.支持== , *和—操作。 之所以推断Return Int是因为在返回之前没有执行任何类型转换。 1号线 memoize的递归支持版本还使用2个类型占位符: T, […]