Tag: Swift 4

在Swift 4中解析JSON:基础知识

Swift标准库定义了一种用于数据编码和解码的标准化方法。 您通过在自定义类型上实现可Encodable和可Decodable协议来采用这种方法。 采用这些协议可以使Encoder和Decoder协议的实现获取您的数据,并在外部表示形式(例如JSON或属性列表)中对数据进行编码或解码。 为了同时支持编码和解码,请声明对Codable符合Codable ,后者将Encodable和Decodable协议结合在一起。 此过程称为使您的类型可编码 。 编码和解码自定义类型 如何在Swift 4中解析JSON? 让我们直接说清楚。 这是一个User的JSON示例: 为了将JSON转换为User实例,我们将struct标记为Codable 。 它应该看起来像这样: 然后,我们创建一个解码器: 还有BOOM! 这就对了!! 重要说明:我们使用了try! 并强行解包,但这只是出于示例的目的,您不应以这种方式使用它。 您应该使用catch来正确处理错误。 做一个好的开发者。 自定义键名 如果您的API采用蛇形惯例,则只需对CodingKeys枚举进行自定义实现。 该枚举定义了如何将属性连接到JSON字段名称。 因此,我们的User模型应如下所示: 来源和阅读链接 编码和解码自定义类型 将JSON与自定义类型一起使用

函数与计算属性-使用什么?

如果任何调用被认为是昂贵的,会在多次调用时引发错误或返回不同的结果-首选函数。 如果调用便宜,则不会引发错误,不会返回相同的结果,也不会缓存第一次调用的结果-计算属性可能会满足您的需求。 – – – – – – – – – – – – – – 要么 – – – – – – – – – – – – – – 如果您的代码执行了某个动作并返回了例如该动作的结果的描述,那么您应该首选函数。 如果您的代码计算出一个属性,但是从用户的角度来看,这可能是一个存储的属性,或者可能是一个存储的属性,需要先更新某些缓存的值,那么您应该更喜欢计算的属性。 例如 ,我们有CookieFactory类来烘烤一些cookie。 我们需要它来查看成分并决定要制作哪种曲奇。 它需要检查有多少成分可用以确定批次大小。 然后,它将需要分割并创建cookie。 听起来很复杂,所以要使用函数是这里的方法。 遵循统一访问原则 模块提供的所有服务都应通过统一的符号表示,无论是通过存储还是通过计算实现,都不应背叛。 —伯特兰·迈耶(Bertrand Meyer) 属性表示实例的固有质量,而方法则执行操作。 方法有参数; 属性没有。 对于有副作用的任何调用,最好使用方法。 如果某个方法执行某些操作(例如,它加载,解析,切换或打印)或具有动词名称,则它不应是属性。 首选属性以获取和/或设置简单值。 属性应表示类型实例的语义固有质量。 错误的计算属性示例: –随机值 – 今天的日期 –来自另一个对象或单例的值 […]

探索Swift

克雷格·格鲁米特(Craig Grummitt)选择的章节 Swift不仅是Objective-C的现代替代品。 自2015年开源以来,Swift已发展成为一种功能强大,现代且富有表现力的语言。 从Web开发到服务器端开发和基于云的服务无处不在! Swift拥有丰富而深刻的技能,可以交付更干净,更快的代码。 您要做的就是找出如何使用它。 探索Swift会提取Manning的三位专家的知识,向您介绍Swift如何处理各种各样的独特问题。 此快速入门指南由iOS开发人员,Manning作者和指导者Craig Grummitt亲自挑选,可让您使用Swift来探索对象,使用枚举为数据建模以及解决图形问题,从而使您对世界上的语言有了深刻的了解数据及其他。 完成后,您将更好地了解Swift的用途,无论是构建下一个大型iOS应用,将其带到服务器上,还是编写无服务器功能! 立即下载此免费电子书 ! ___________________________________________________________________ 有关更多免费内容,请访问Manning的免费内容中心。 ___________________________________________________________________ 关于作者: 克雷格·格鲁米特 是一位成功的开发人员,讲师和导师。 ‘t Veen的Tjeerd是一位高级软件工程师和架构师,负责构建iOS应用。 David Kopec是位于佛蒙特州伯灵顿的尚普兰学院的计算机科学与创新助理教授。

带有Encoder和Encodable的JSON

Swift 4带来了一种更加原生的方式来编码和解码实例,并内置了对每个人最喜欢的基于文本的格式的支持:JSON! 我们不使用所有的编码和解码源代码,而是采用一种不同的方法,并逐步通过一个简单的示例:单个Int实例如何通过JSONEncoder变成JSON数据? 从那里,我们应该能够更进一步,了解其他原始类型,数组,字典等是如何编码的。 封存 NSCoding作为Cocoa的一部分已经存储和检索数据很长时间了。 令人振奋的消息是,由于NSKeyedArchiver已有15年的历史了,Apple终于宣布弃用NSArchiver 。 😜 一个好主意是,如果可以对诸如字符串和数字之类的单个实例进行编码和解码 ,则可以存档和取消存档整个对象图。 编码所有事物 在Swift标准库中,除了编码 器之外,还有一些可编码的东西。 可编码是一种协议。 符合类型可以将自身编码为其他表示形式。 编码器也是一种协议。 编码器负责将可Encodable内容转换为其他格式,例如JSON或XML。 Encodable类似于NSCoding但作为Swift协议,您的Swift结构和枚举也可以加入聚会。 类似地,尽管Encoder还是协议而不是抽象类,但它与NSCoder对应。 一个简单的整数 您不能使用JSONEncoder编码裸标量,而是需要顶级数组或字典。 为简单起见,让我们从编码包含单个整数[42]的数组开始。 let encoder = JSONEncoder() let jsonData = try! encoder.encode([42]) 首先,我们实例化JSONEncoder ,然后使用数组在其上调用encode() 。 那里发生了什么事? // JSONEncoder.swift open func encode(_ value: T) throws -> Data { let encoder = _JSONEncoder(options: self.options) encode()方法采用一些Encodable值,并返回原始JSON Data 。 […]

Swift中数组的受限扩展

协议和扩展是快速发展的组成部分。 到目前为止,您可能已经使用了很多时间。 您可能出于各种原因为您的班级或结构创建了扩展。 这里我将给出一些示例,其中您可以为几个现有的类进行扩展。如果你们还记得在Objective-C上工作,那么您将与Catagories交叉。 在这里,约束扩展是一种类别,您可以在不知道其内部工作的情况下扩展现有对象的功能。 在这里,我将以数组为例,数组是同质元素的集合,在进行实时项目时,您需要处理很多需要不断操作的数组,您可以提出扩展一样的 字符串数组 让我们假设一个场景,其中您有一个字符串数组,并且需要事先存储少量数据,例如 总字符数 字数 每个单词中的字符数 让我们来看一个数组示例,如下所示 let arrayString:[String] = [“教父”,“肖申克的救赎”,“辛德勒的名单”,“愤怒的公牛”,“乱世佳人”,“绿野仙踪”,“阿拉伯劳伦斯”,“阿甘”] 现在,假设您在整个项目中具有与上述所需的实现相同的数组。 为了避免重复并扩展现有Array的功能,我们可以编写如下扩展 通过在Array上实施受约束的扩展,您可以轻松避免代码重复,并且Array操作很容易。 让我们继续测试实施 让characterCount = arrayString.totalCharacterCount() 让wordCount = arrayString.wordCount() 让eachCharacterCount = arrayString.elementCharacterCount() 打印(“ characterCount = \(characterCount)”) 打印(“ wordCount = \(wordCount)”) print(“ eachCharacterCount = \(eachCharacterCount)”)//这将打印characterCount = 128 wordCount = 22 eachCharacterCount = [13、24、16、11、18、16、18、12] 这是数字的另一个例子 这是数字数组的另一个例子 在上面的示例中,这里以计算为例 数组元素的总和 将数值数组转换为字符串数组 这可以在任何数字数组上无缝运行,但在数组中的其他元素上同样会出错。 […]

使用计算属性和惰性var之间的陷阱

惰性存储的属性是直到首次使用才计算其初始值的属性。 您可以通过在声明之前编写lazy修饰符来表示一个惰性存储属性。 除了存储的属性外,类,结构和枚举还可以定义计算的属性 ,而实际上并不存储值。 相反,它们提供了一个getter和一个可选的setter,以间接检索和设置其他属性和值。 编码一段时间后,您的大脑可能会告诉您它们是相同的。

掌握核心数据(第0部分)

#核心掌握数据 项目链接:https://github.com/aliakhtar49/Mastering-in-CoreData Twitter帐户:https://twitter.com/aliakhter49 Linkedin:https://www.linkedin.com/in/aliakhtar49 供讨论 https://ios-venturedive.slack.com/messages/CHE7CA7Q8/team/U67G7FYPM/? 内容正在审核中(进行中) 第1部分(简介) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-1-introduction-7c5d667bfabd 第2部分(核心数据栈) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-2-core-data-stack-ac447d3eb68c 第3部分(编码:核心数据中的CRUD) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-3-coding-crud-in-core-data-b7a278436c3 第4部分(第4部分,面向核心数据对象的CRUD) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-4-crud-in-core-data-object-oriented-style-a592439d7687 第5部分(核心数据中实体之间的关系) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-5-relationship-between-entities-in-core-data-b8fea1b50efb 第6部分(核心数据CRUD操作中的实体之间的关系) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-6-relationship-between-entities-in-core-data-crud-operation-87138fdf6fea 第7部分(核心数据关系删除规则) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-7-core-data-relationships-delete-rules-4798c6c0e762 第8部分(核心数据中的验证) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-8-validation-in-core-data-b38b8038e878 第9部分(NSFetchRequest) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-9-nsfetchrequest-d9ad991355d9 第10部分(NSFetchRequest) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-10-nsfetchrequest-a011684dd8f7 第11部分(多线程并发规则) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-11-multithreading-concurrency-rules-70f1f221dbcd 第12部分(多线程并发问题) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-12-multithreading-concurrency-problem-212a85f37930 第13部分(多线程并发策略通知) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-13-multithreading-concurrency-strategy-notifications-63ef0f110293 第14部分(多线程并发策略父级-子上下文) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-14-multithreading-concurrency-strategy-parent-child-context-305d986f1ac3 第15部分(父级多线程并发策略—儿童用例1) https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-15-multithreading-concurrency-strategy-parent-child-use-case-1-12a180a6fc34 第16部分多线程并发策略父级-子用例2 https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-16-multithreading-concurrency-strategy-parent-child-use-case-2-bf7dd7e5245a 第17部分多线程并发策略上下文UndoManager https://medium.com/@aliakhtar_16369/mastering-in-coredata-part-17-multithreading-concurrency-strategy-context-undomanager-d4a52138978a 第18部分使用核心数据的简单持久层架构 (进行中) 第18部分使用核心数据的高级持久层架构 (进行中) 第19部分:高级查询 (进行中) 第20部分核心数据中的错误 (进行中) 第21部分多个永久性商店 (进行中) 第22部分:多持久性存储协调器 (进行中) 第23部分:在App和Widget之间共享核心数据 (进行中) […]

迅捷100天:专案1 –点数计数器

环境:Swift 4 /日期:1 /日期:2017年10月17日/时间:1小时 我学到什么: ・ Mainstoryboard配置标签和按钮 ・基本的 ・客制导航栏 Github原始码:这里 小知识: 仔细看看这个app,跟一般的app有什么不一样? 简单来说,正常的Navigation Bar是这个模样: 但这个app则是这个样子,像是根本没有Navigation Bar一样: 发现哪里不一样了吗?没错,Border消失了! 这是怎么做到的呢? 在viewDidLoad里面,加入以下程序码,就可以顺利把Border消除: navigationController?.navigationBar.setBackgroundImage(UIImage(),用于:.default) navigationController?.navigationBar.shadowImage = UIImage() 原理可以参考这篇文章:iOS开发小结— UINavigationBar设置shadowImage 心得: 如果我们想到达终点,则应该从搜索起点开始。 这只是第一天,虽然是个很简单的app,尤其对一个已经学了一年Swift的人来说,但一阵兴起,开始埋头进入神圣的“ 100 Days of Swift”,其实就是希望自己,放下所有,回到原点。 为什么想回到原点? 最近的在各式专案中奔波,在架构中跳来跳去,却一直一个萝卜一个坑,这个还没搞懂,那个又来捣乱。 该死的MVVM? 故事板还是没有? 面向对象还是协议? 自定义导航栏和标签栏? 真正的冬青雅致Alamofire吗? 最后,Swift 4来了。 ((最近看太多冰与火之歌大声笑。总之,好多问题,好多答案,更多疑惑,更难选择择一。 那究竟为什么,变得如此困难,如此挣扎?好像进入强迫症的心灵,在镜子中看着自己,好想逃,却出不去。 当初,好一个当初。自己在一开始接触Swift的时候,那股热情与赤诚,好像心有所属了那般。每天只想多与它多相处片刻,因为每分每秒都学习到更多,我可以认真认识自己成长。 但就如所有梦,没有坏人就没有情节,之前看了一篇文章:学编码很简单,但想要靠它吃饭你必须经过这4大阶段,这张图我越来越有感: 超级绝望!信心超低!能力…… “放下吧!”我告诉自己。 如果要达到终点,我们应该从寻找起点开始。 找到最初的感动,拾回成长的快乐,重新站稳步伐,你会走更远。

UIInterfaceOrientation —仅在将应用设置为纵向模式时如何更改方向?

如今,大多数应用程序都基于纵向模式。 例如,来自客户端的要求是某个屏幕需要处于横向模式。 那怎么办呢? 并覆盖supportedInterfaceOrientationsFor,如下所示: 然后在您要在其中切换方向的控制器中。 编写以下函数: 最后,在您的viewDidAppear和viewDidDisappear中 : 运行并测试您的应用。 它应该工作正常。 特别感谢我们的团队成员Muhammad Raza为此开发了一个示例应用程序。 您可以在此处的链接中查看。 如果您有任何疑问,请随时将其放在下面的评论部分。 平安了!

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) 联系人=试试? […]