Tag: 编码

Swift4中自动解码的性能

在很多情况下,您将面临通过网络发送或接收数据(或仅保存/加载文件中的自定义对象)的问题。 而且,当然,有几种不同的技术可以对JSON进行序列化/反序列化-您可以自己完成操作,也可以使用第三方框架。 最后,Apple提供了新的编码和解码自定义类型。 到目前为止,您的数据类型变得可编码和可解码,以与JSON等外部表示兼容。 它提出了极其简单明了的方法,减少了代码并节省了时间。 是不是很酷? 好… 测量解码自定义类型 不幸的是,我们没有生活在一个完美的世界中。 有时需要处理带有很多胖对象的胖JSON,而我们对此无能为力。 让我们比较一下通过新的API自动解码自定义类型和手动解码(意味着完全手动解码,而不是“ init(来自解码器:解码器)”)。 我已经创建了简单的结构`Writer`。 它符合`Codable`,并且可以用`JSONDecoder`解码。 也可以使用执行手动解码的init(dictionary :[String:Any] ) `对该对象进行解码。 测试环境和配置: iPhone 7,iOS 11.2 构建配置:发布 优化级别:[-Ofast] struct作者:可编码{ var名称:字符串? var email:字符串? var contact:字符串? var years:整数? var isPublic:布尔? } 苹果还为支持“可编码”的对象提供了自己的“手动编码和解码”实现。 如文档中所述: 如果您的Swift类型的结构与其编码形式的结构不同,则可以提供Encodable和Decodable的自定义实现,以定义自己的编码和解码逻辑。 因此,为了测试结构,添加了扩展名`init(from解码器:Decoder)`。 扩展作家:可解码{ 枚举CodingKeys:字符串,CodingKey { 案例名称 案例电子邮件 案例联系 案例年 案例是公开的 } init(来自解码器:解码器)抛出{ 让值=尝试解码器。容器(keyedBy:CodingKeys.self) 名称=尝试? values.decode(String.self,forKey:.name) 电子邮件=尝试? values.decode(String.self,forKey:.email) 联系人=试试? […]

在iPad上编码? 当然可以!

独立软件开发人员Anders Borum的客座博客帖子,对使用平板电脑和手机进行编程非常感兴趣。 自2014年以来,他一直在制作iOS的Git客户端Working Copy。 您要在iPad上编码吗? 想知道为什么iOS本身无法运行iOS应用程序的开发工具? 您在旅途中手指是否渴望进行编程? Anders Borum创建了 工作副本 来应对这些挑战。 我使用Bitrise的原因并不常见:持续集成的构建服务器的价值随团队规模的增加而增加,但我一个人工作,在本地运行测试对于我的小型设置非常有效。 但是,我将展示如何使用Bitrise也可以在iOS设备上进行iOS开发,这意味着您可以在iPad上开发应用程序。 我将通过您正在使用的应用程序指导您。 我正在开发一款小型游戏,训练在触摸屏键盘上打字,以期提高速度并降低错误率。 游戏还试图解决程序员之间长达十年的争论,而您必须站在一边: 制表符或空格 。 我们来看一下: 游戏尚未完成,还有很多事情需要解决:我想关注启动屏幕的底部。 另外,在等待用户在选项卡或空格键之间进行选择时也没有移动,我希望“星系间的安全性”动画到位,并且我想出一种老式效果。 我会继续努力。 🙂 该游戏是需要Xcode构建的本地iOS应用程序。 我大多数时候都带着iPad,但没有普通计算机,因此也没有Xcode。 我的iPad确实有Swift Playgrounds,这是一个编程环境,专注于在编写代码时立即显示结果。 我在Swift Playgrounds内部制作了打字动画的原型,并且生成的代码易于集成到Xcode项目中。 视频中显示的游乐场显示一个视图控制器,并制作了我的自定义作家效果标签的两个实例。 您可以看到如何在产生这些值的代码表达式的右侧显示数字,字符串和颜色。 这使Swift Playgrounds成为尝试新想法的非常不错的工具。 如果我要展示编写者效果的编程方式,那将是一段令人难以置信的视频,尤其是因为我多年没有使用CADisplayLink并不得不研究文档。 视频显示了我对标签的颜色进行了调整。 从Swift Playground到Xcode项目转移工作时,我只需要label类本身,这就是为什么您看到我复制一些文件的原因。 如果以后要继续在Swift Playgrounds中工作,我会将AnimatedLabel保留在其自己的文件中。 现在,我需要一台运行Xcode的计算机来构建应用程序。 幸运的是,Bitrise只需将其推送到Git遥控器即可提供此功能。 因此,我开始构建,几分钟后,Bitrise通过电子邮件发送了结果,称结果失败。 几分钟后,Bitrise通过电子邮件告知结果,结果表明构建失败。 😒 该电子邮件包含指向状态页面的链接,其中包括构建日志。 在Safari中打开它并调用共享表,我可以使用“ Open in Working Copy将日志发送回应用程序。 在工作副本中查看日志时,它需要与正确的存储库关联,并且日志中提到的任何文件名都将链接到源代码。 Bitrise日志中提到了文件名和行号以及错误,因此我可以直接进行修复。 推送提交以触发Bitrise上的新构建。 第二次是魅力,在成功构建之后,Bitrise向我发送了一个链接以安装新版本。 Bitrise向我发送了状态电子邮件,就像上次构建时所做的一样,但是由于一切正常,因此第二封电子邮件包含用于安装该应用程序的链接,该电子邮件更为相关。 […]

使用Swift 4学习iOS开发的免费资源

如果您在Instagram上关注我,那么您现在可能已经知道我过去一个月一直在学习本机iOS开发。 我一直想从事移动开发已有一段时间,现在我有机会在MedMen工作,现在我需要我帮助使用Swift 4.2和Xcode 10来构建应用程序。很难找到巨大的资源,尤其是免费的。 那里太多了,很难找到好的。 这是我过去一个月一直在使用的一些资源,可以帮助我学习。 请记住,这些资源中有很多是假设您已经具备编程知识的。 基本上,您应该已经至少知道一种语言,并且熟悉诸如函数和变量之类的基本概念。 以编程方式学习UI设计,无需情节提要 以下视频向您很好地介绍了使用代码(而不是Storyboard)创建应用的UI。 对于开发人员来说,知道如何做到这两者都是件好事。 大多数教程都使用情节提要,但我最终从这个家伙那里找到了一系列不错的视频,向您展示了如何使用代码来完成这些操作。 许多团队可能也会更喜欢您以编程方式发表观点。 这是因为版本控制比较容易,而Storyboard却有点混乱。 如果您自己构建一个应用程序,则可以按自己的喜好坚持使用Storyboard。 苹果在Swift上的官方电子书 苹果对Swift编程有相当扎实的介绍。 Swift编程语言4.2是一本很棒的快速阅读语法概述的文章,快速介绍了如何声明变量和函数之类的内容。 要深入研究实际构建本机应用程序并熟悉ARKit和UIKit等可用框架,请阅读使用Swift开发App。 这本书的目的是将可以入门的完整知识带给可以编写简单应用程序的初级开发人员。 如果您已经了解基本的编程概念,则可以跳过某些部分,直接跳到解释可用框架以及如何实际构建简单应用程序的部分! 我目前正在亲自阅读这两本书,并发现它们很容易理解。 观看Sean Allen的iOS开发视频 肖恩·艾伦(Sean Allen)提供了一些有关构建本机iOS应用程序的精彩视频。 我强烈建议您查看他的视频。 他快速介绍了如何构建一个非常简单的移动应用程序,以帮助您入门,并了解构建移动应用程序的方式。 我希望这些资源可以帮助您开始进行移动开发。 如果您来自Web开发背景并且了解React或Angular,我想添加一些有关UIView及其子类的提示。 只需将它们视为组件即可! 每个部分都独立工作,并具有自己的功能和控制器。 祝您好运,编码愉快! 🙂

关于值和引用类型的快速指南

Swift中的值和引用类型定义了如何在代码中直接传递变量或通过复制数据来传递变量。 它们的用法会极大地影响您组织和编写代码的方式。 值类型 值类型是不可变的,一旦设置就无法编辑。 对变量的任何更改都会导致该值类型的新实例。 如果使用诸如var i = 10类的变量,这似乎违反直觉,因为vars是可变的,但实际上,每次更新该变量时,我们都会创建一个新的内存中实例。 “ 值类型最基本的区别特征是复制-赋值,初始化和参数传递的效果-创建具有其数据唯一副本的独立实例 ”-Swift Blog 考虑以下代码: var testScore:Int = 80 var studentA.testResults = testScore testScore = 90 如果我们读出学生A的测试结果,我们期望他或她的分数为80。这是因为变量studentA.testResults设置了内存中有testScore的副本,而不是 testScore的实际实例。 将值类型分配给变量后,对其进行的任何更改均不会影响该变量。 像testScore这样的Integer使用值语义来实现此结果。 参考类型 引用类型是对象的共享实例,直接在代码中传递。 将其从一个变量复制到另一个变量时,它们都将访问相同的实例和数据。 因此,更改一个将影响另一个。 类TestResults {var score:Int?} var results = TestResults()var studentA.testResults = results var studentB.testResults = resultsstudentA.testResults.score = 95 studentB.testResults.score = 75 如果我们读出测验分数,则两个学生的测验分数均为75! 这是因为类是使用引用语义构建的。 学生A的测试结果引用了与学生B相同的results变量,因此当我们将分数更新为75时,两个学生均获得新成绩。 […]

使用中间类型在Swift中解码JSON

基础 要解码JSON结构并将应用程序中的模型编码回JSON,您可以使模型符合Swift Codable协议。 这是另外两个协议的组合: Decodable和Encodable 。 这对于简单的JSON数组和字典非常有用,例如: 让json =“”“ [ { “名称”:“年度旅行保险”, “ paymentFrequency”:“每年”, “ description”:“全年安全旅行。” }, { “名称”:“汽车保险”, “ paymentFrequency”:“每月” } ] “”“ .data(使用:.utf8)! 您可以使模型符合Codable (或Decodable )协议: struct BankProduct:可编码 { 变量名称:字符串 var paymentFrequency:付款频率 var说明:字符串? 枚举PaymentFrequency:字符串,可编码{ 每月个案 每年一次 } } 只要JSON数组中没有其他不代表我们模型的元素,所有内容都会自动解码。 否则,解码将失败。 这意味着我们可以在JSON结构的每个元素中添加额外的键,但是键name和category应始终位于该元素中,因为它们在我们的模型中不是可选的。 在此示例中,还添加了一个枚举,因此您可以看到,只要枚举符合(De)Codable协议且枚举的大小写名称与中的字符串相同,它就会自动将JSON转换为正确的大小写。 JSON。 否则,您需要为案例提供一个rawValue 。 我们可以使用以下方法从JSON创建对象: 让解码器= JSONDecoder() 让产品=尝试解码器。解码([BankProduct] .self,来自:json) 当JSON的键名与模型中属性的名称不匹配时,我们需要一个名为CodingKeys的嵌套枚举,其枚举类型应符合CodingKey协议,它的String rawValue类型。 枚举应包含所有键,即使在模型和JSON中具有相同名称的键也是如此。 […]

迅捷4 –可腐化和可编码💼

大家好🤚🏼 我已经几个月没写新文章了,原因有很多(第一个是WWDC’18),但是我现在不谈论这个。 去吧去吧🤟🏼 编码和解码自定义类型 使您的数据类型可编码和可解码,以与JSON等外部表示兼容。 Swift标准库定义了一种用于数据编码和解码的标准化方法。 您通过在自定义类型上实现可Encodable和可Decodable协议来采用这种方法。 采用这些协议可以使Encoder和Decoder协议的实现获取您的数据,并在外部表示形式(例如JSON或属性列表)中对数据进行编码或解码。 为了同时支持编码和解码,请声明对Codable符合Codable ,后者将Encodable和Decodable协议结合在一起。 此过程称为使您的类型可编码 。 来源:点击这里 如您所见,这些是处理原始JSON片段最重要的事情。 在某些情况下, 一些人认为对于复杂的JSON结构很难。 在我这方面,这是不可接受的。 特别是,在Apple推出Encodable和Decodable之后,使用JSON粒子播放变得非常简单。 有两种编码和解码协议 。 如; 可编码和可分解 。 可编码的只是代表这两个协议的类型别名。 typealias Codable = Decodable & Encodable 显然,您可以使用此类型别名来编码和解码 。 CodingKeys允许您使用特定的变量名称来表示JSON密钥。 可以根据外部表示进行解码的类型。 我们的JSON片段如下。 JSON片段 让我们发现盒子里发生的事🎉 可解码协议的示例 可以将自身编码为外部表示形式的类型。 可编码协议的示例 如果您有任何具体问题,请不要犹豫与我联系。 推特:@ strawb3rryx7 传播这个词

Swift 4中的可编码和可解码

在iOS的日常开发中,许多任务涉及调用API和Web服务,将数据保存到磁盘以及使用自定义类型对对象进行建模,这些对象代表应用程序的用例和功能。 这样做时,我们必须将数据与中间格式(JSON,属性列表)之间进行转换。 对于数据编码和解码任务,Swift提供了可编码和可解码协议。 通过确认这些协议,可以将自定义类型编码到外部表示形式(例如JSON和Property List(pList))并从中解码。 在本文中,我将介绍如何使用Encodable和Decodable在JSON和JSON之间转换自定义类型实例,以及使用这两种协议进行编码和解码任务的许多方面。 编码方式 将您的自定义类型实例转换为其他表示形式(例如JSON和pList)的过程称为编码或序列化。 对于编码,自定义类型符合Encodable协议。 解码 将诸如JSON或pList之类的表示形式的数据转换为自定义类型的实例的过程称为解码或反序列化。 对于解码,自定义类型符合可解码协议。 可编码 为了同时支持编码和解码,自定义类型可以符合Codable协议,而后者又符合Encodable和Decodable 。 typealias可编码=可编码和可解码 自动编码和解码 默认情况下,Swift Standard Library和Foundation Framework中的许多类型(例如Int,String,Data,URL,Date等)都是可编码的。 若要使任何自定义类型自动变为可编码,它应符合可编码协议,并且其所有存储的属性都应是可编码的。 例如,这是一个表示Movie的结构。 struct Movie { var movieId:Int? 变量名称:字符串?} 只需遵循Codable,即可对Movie类型进行编码和解码。 struct Movie:可编码{ var movieId:Int? 变量名称:字符串?} 同样,具有自定义类型属性的自定义类型是可编码的,只要其所有属性都是可编码的即可。 例如,假设我们有MovieDetail结构来表示电影细节​​。 struct MovieDetail:可编码{ var语言:字符串? var genre:字符串? var releaseDate:字符串? var bannerImageUrl:字符串?}结构电影:可编码{ var movieId:整数? var名称:字符串? var movieDetails:MovieDetail?} 由于MovieDetail也符合Codable,因此Movie也可编码。 Swift集合类型(例如Array , Dictionary和Optional只要包含Codable类型,就变为Codable。 […]

扩展,私有和文件私有

封装是面向对象编程的四个基本原理之一。 访问控制是启用封装的设备的一部分[1]。 私有,文件私有,内部和开放是Swift中可用的四个访问控制。 这篇文章是关于我将如何使用扩展以及private和fileprivate来组织我的代码的简短说明,这导致了抽象。 在项目开始时很难进行抽象,尤其是在产品的所有功能和要求不清楚时。 在这里,我们组织代码的方式非常方便。 我从中受益的一件事就是使用扩展来组织我的代码。 随着项目的发展,这些扩展趋向于成为单独的类,结构或协议(在我的情况下主要是协议),并帮助我将自己的意图清楚地传达给其他开发人员。 让我们看一下这个新闻应用程序的示例,该示例具有两个集合视图选项卡,每个选项卡都显示某种类型的内容列表 TabA —显示来自某些集合的列表,但是没有完全定义需求。 TabB-显示最近添加的新闻文章,基于文章中嵌入的内容,UICollectionViewCell中将有一个媒体指示器(视频或音频)。 在本文中,我将重点介绍媒体指示器功能。 我们知道TabB的要求,此处显示了一个名为ArticleTeaser的视图模型(以1为例)。 它具有标题,文章的简短摘要以及文章中嵌入的媒体。 有一个计算属性mediaDisplayType ,它显示媒体是什么类型。 现在,让我们看一下另一个示例,该示例说明我们如何使用一些扩展来组织代码 现在,此扩展程序提供了从媒体列表中找到嵌入的媒体类型的功能。 这也使其他开发人员可以清楚地使用mediaThumbnailType fileprivate函数,该函数是此扩展的接口。 我的一位同事总是问我为什么您只有一个功能的扩展名? 答案是我倾向于将提供类/结构的特定行为的函数归类为扩展,即使它只是一个函数。 随着代码库的增加,这很方便。 现在,当TabA的要求到达时,我们注意到它还必须显示一些有关媒体类型的信息。 如果我们注意到扩展,我们使用的函数没有副作用,因此我们可以轻松地将其移入协议。 我们可以想到具有文件私有功能的这些扩展,就像我们编写的任何其他接口一样,但也可以作为在单个类/结构中使用的接口。 编码愉快! [1] https://en.wikipedia.org/wiki/Access_control

了解Swift中的类型擦除

免责声明:本文的代码摘自 Mattt的 一本令人称奇的书, 名为《 Flight School Guide to Swift》 。 为了理解类型擦除,让我们看一个简单的例子。 假设我们有要解码的JSON。 JSON如下所示: { “ foo”:“你好”, “栏”:123 } 上面的JSON没有具体的类,因为我们不知道JSON将包含多少个键值对。 在Swift 4.0中,我们可以尝试使用JSONDecoder类,如下所示:

你好。 Desarrollando在iOS上的应用程序(I)

在iOS设备上运行Desarrollar的应用程序。 编程辅助程序为0或-4。 Despuésde casi 3个因果关系的最终解释权是在0天内的经验。 。 不需要任何必要的理由。 纳迪(惯常的习惯)的左手右手和左手的右手腕上的手枪和手枪。 简单的体验性的“ algo”和“ las siguients frass han sasado”的片段:“ megustaríaalgo que…”“ojalápudiera…”“ Esto no funciona bien…” Vaya mierda de app”“ Vaya mierda de web”“¿Porquénadie ha hecho…。?” 重要的预告片。 Es la que te将tanto que finalmente te lleva切成“ pues lo hago yo”。 En mi caso fueasí,布宜诺斯艾利斯,马诺斯。 苹果公司的粉丝,一般的技术合作伙伴。 Durante mucho tiempo he comprado,arreglado,vendido ordenadores […]