Tag: Swift 4

迅捷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 传播这个词

RxSwift:subscribeOn与observeOn?

它允许您更改将在其上执行订阅代码的调度程序。 subscriptionOn更改其之前的调用的线程以及其后的方法。 顺序无关紧要,subscribeOn可以放在任何地方。 它允许您更改将在其上执行观察者代码的调度程序。 让我们了解两者: watchOn仅在下游工作 subscriptionOn位置无关紧要。 它在下游和上游工作 连续的subscribeOn不会更改线程 随之而来的watchOn确实改变了线程 观察值不能被subscribeOn覆盖 如果您有兴趣探索更多内容,RxJava中有一篇不错的文章: http://tomstechnicalblog.blogspot.com/2016/02/rxjava-understanding-observeon-and.html 您可以在以下位置找到我: Linkedin: Aaina Jain 推特: __aainajain 如果您对下一篇文章有​​任何建议,请给我发送电子邮件至aainajain100@gmail.com。

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。 […]

UIGraphicsImageRenderer

用于创建支持Core Graphics的图像的图形渲染器。 总览 您可以使用图像渲染器完成绘图任务,而无需处理诸如颜色深度和图像比例之类的配置,也无需管理Core Graphics上下文。 使用诸如图像输出尺寸和格式之类的参数初始化图像渲染器。 然后,您可以使用多个绘图功能之一来渲染共享这些属性的图像。 渲染图像: (可选)创建UIGraphicsImageRendererFormat对象,以指定渲染器用于创建其上下文时应使用的非默认参数。 实例化UIGraphicsImageRenderer对象,提供输出图像的尺寸和格式对象。 如果您不提供格式对象,则渲染器会对当前设备使用明智的默认设置,如创建图形图像渲染器中所示。 根据所需的输出选择一种渲染方法: image(actions:)返回一个UIImage对象; jpegData(withCompressionQuality:actions:)返回JPEG编码的Data对象; 和pngData(actions:)返回一个PNG编码的Data对象。 执行选择的方法,提供Core Graphics绘图指令作为闭包参数,如使用Image Renderer创建图像中所示。 使用“混合模式”演示了一些可在绘图说明中使用的更高级的渲染功能。 (可选)您可以在提供给渲染方法的绘图说明中使用Core Graphics绘图代码,如使用Core Graphics渲染功能中所示。 初始化图像渲染器后,您可以使用它来绘制具有相同配置的多个图像。 图像渲染器保留了Core Graphics上下文的缓存,因此重用同一渲染器比创建新渲染器更有效。 样例代码 参考文献 UIGraphicsImageRenderer 您可以使用图像渲染器完成绘图任务,而无需处理诸如颜色深度和颜色等配置 。developer.apple.com

带有枚举的Nifty,Bug-Safe URL

这是一个分为四部分的系列文章的第二篇,该文章名为: Nifty,Swifty,API支持的App 。 您可以在 此处 分叉最终项目 。 第1部分:具有GitHub Pages的Nifty静态内容托管 第3部分:具有可分解功能的漂亮自构对象 第4部分:带有NSCache的漂亮的自动缓存ImageView 介绍 在上一篇文章中,我们设置了静态内容宿主,并在Xcode项目中创建了一个非常简单的APIService,下载了一些json内容。 调用下载json的方法如下: 我们可以在第一行看到传递的字符串相当长,这是在根目录中获取数据。 想象一下,当我们导航到层次结构中更深的文件时,字符串将得到多长时间! 显然,URL路径越长,我们的代码就越容易受到拼写错误的影响。 在本文中,我们将创建一个枚举,以最简单,最安全的方式处理所有文件路径。 创建URL枚举 在我们的应用程序中,URL将仅由我们在上一篇文章中构建的APIService使用。 因此,有意义的是,处理我们不同的url大小写的枚举位于同一实体中。 这是我们的两种情况: 您会注意到baseURL存在于枚举之外,这在每种情况下都是必需的(第3行) 。 我们的枚举有两个变量: path (第9行)和url (第16行) 。 这是因为我们要使用字符串构建路径,然后使用该路径来初始化我们的URL。 注意,在url结构(第18-19行)中 ,我们可以简单地调用self.path来获取所需的字符串。 因为objectData.json是我们唯一需要的根文件,所以其路径构造非常简单(第11行) 。 另一方面,获取我们的图像需要一个图像文件名作为关联值,作为我们的终点。 要提取关联的值并将其用于我们的字符串构造中,请使用let (第12行) 。 使用URL枚举 现在,我们可以将输入参数更改为新的APIURL类型,而不是将冗长的字符串传递到fetchData方法中。 文件1:在方法定义中,我们以枚举形式作为输入参数,因此我们需要使用apiURL.url (第3行)来获取URLSession的url。 文件2:现在,当我们可以调用方法时,可以使用非常简单的点表示法.json (第1行) 包起来 这就是每次提供安全网址的简单程度! 使用具有关联值和计算变量的枚举非常强大,并且可以最大程度地确保您的URL可以正常使用,从而使您可以灵活地获取所需的任何端点。 请单击此处阅读第3部分: 具有Decodable的Nifty自构造对象 ,在这里我们使用json安全构建对象并且没有疯狂的解析。 谢谢阅读!

快速失败的初始化器

简短而详细地介绍了失败的初始化程序。 Apple docs :初始化是准备使用的类,结构或枚举实例的过程。 此过程涉及为该实例上的每个存储属性设置一个初始值,并执行新实例准备使用之前所需的任何其他设置或初始化。 定义类 , 结构或枚举值时,如果初始化程序失败,应通知用户。 由于以下原因,以下变量的初始化有时可能会失败: 无效的参数值。 缺少必需的外部源。 阻止初始化成功的条件。 为了捕获初始化方法引发的异常,Swift生成了一个灵活的初始化,称为“ failable initializer”,以在初始化结构,类或枚举实例时通知用户发生了问题。 通过在init关键字( init? )后面放置问号,可以编写失败的初始化程序。

编码与对象映射器

我最近一直在尝试使用Swift的新Codable协议,以将从远程服务获取的JSON映射到Swift模型对象。 出于某种背景,在Swift 4中添加了Codable,作为一种干净地允许对象将自身转换为外部表示的方法。 可编码本身只是可解码和可编码的一种类型。 在这篇文章中,我将重点介绍Decodable部分,因为它是我感兴趣的远程JSON表示形式的转换。 比较方式 过去我曾经广泛使用过ObjectMapper,但由于Codable现在已内置到Swift中,所以我想对两者进行比较。 我要比较的功能是: 验证🕵️ 自定义转换(映射到自定义类型,例如将JSON字符串映射到正则表达式) 错误处理⚠️ 我要解析的数据是我们为BBC Sport应用远程获取的真实配置 这是一个相当简单的JSON结构,但是它有几个正则表达式,我想将其映射到NSRegularExpression ,而不是String 对象映射器 使用ObjectMapper映射此JSON模型所需的结构如下。 这些结构都符合ImmutableMappable 协议,这意味着他们需要一个构造函数,该构造函数接受Map对象,如果映射失败,则抛出错误。 验证方式 要执行验证,您可以使用Optionals。 在此示例中,我们确定该应用程序可以在没有这些电子邮件地址的情况下运行,因此这些电子邮件是可选的。 如果不存在键或无法将其map.values(“emails”)转换为正确的类型,则map.values(“emails”)会引发错误。 我们利用try? 捕获该错误,如果有错误,只需将其转换为nil值即可。 如果我们确定特定属性是必需的,那么我们就不会将其标记为可选属性,并允许错误传播。 总体而言,使用ImmutableMappable验证非常简单 您可能已经注意到,在此调用map.value(“regex”, using: RegexTransformer())了另外一个参数map.value(“regex”, using: RegexTransformer())这是用于将String转换为NSRegularExpression的自定义转换,这使我的NSRegularExpression ! 自定义转换 ObjectMapper开箱即用地支持自定义转换,这非常简单。 在这里,我们只是实现TransformType协议和关联的transformFromJSON方法。 那需要一个类型,然后我们将其强制转换为String ,然后安全地try? 将String转换为NSRegularExpression 。 然后可以在任何地方重用此变压器reuse 错误处理 为了测试错误处理,我将使用缺少output键的JSON文件。 通过ObjectMapper运行此命令时,我们会收到一条非常有用的错误消息。 映射时出错。 -原因:无法转换为“字符串” -位置:Config.init(map :):30 -键:输出 -currentValue:无 它告诉我们快速找到问题所在的一切。 我发现使用AlamofireObjectMapper集成时,错误被抑制了,这不理想。 可编码 开箱即用的等效Codable实现如下 尽管使用CodingKey协议将键定义为enums但它与ObjectMapper非常相似。 […]

具有可腐烂性的漂亮自构物体

这是一个分为四部分的系列文章的第三篇,该文章名为: Nifty,Swifty,API支持的App 。 您可以在 此处 分叉最终项目 。 第1部分:具有GitHub Pages的Nifty静态内容托管 第2部分:带有枚举的Nifty Bug-Safe URL 第4部分:带有NSCache的漂亮的自动缓存ImageView 介绍 在上一篇文章中,我们使用错误安全的网址获取了json数据。 现在,我们想使用该数据为我们的项目创建Person对象。 我曾经使用JSONSerialization来执行此类任务,它将根据输入的json数据生成一个字典。 构造所需的对象将需要遍历字典中的每个键,将值向下转换为所需的类型,然后将其分配给对象中的适当属性。 这很费力,并且容易出错,因为您必须键入每个键。 幸运的是,这现在是从json实现对象创建任务的“老方法”,并且现在有了Decodable协议,它非常安全且易于实现。 用可解码初始化对象 让我们从以下位置的json开始:https://timmybea.github.io/StaticHostingDemo/objectData.json 您会注意到,我们有一个键“ person”,其中包含一个数组json对象,这些数组包含我们的人员数据。 因此,让我们由内而外地进行工作,并从构造我们的Person对象开始: 我们的对象仅对json中的每个人信息都有一个属性。 现在我们可以遵循Decodable ,为我们的解码器创建密钥并设置我们的init方法。 在此代码中,我们遵循Decodable (第1行)的要求 ,并为我们的编码键(第9-15 行)创建一个枚举。 请注意,枚举类型必须为String并符合CodingKey协议。 对于每种情况,我们都分配与json键匹配的原始值。 接下来,我们实现协议初始化程序init(来自解码器:) (第17–27行)。 这涉及到使用.container(keyedBy 🙂 (第18行)将保存我们数据的解码器转换为KeyedDecodingContainer ,然后使用.decode(type :, forKey :)将每个键处的数据解码为所需的数据类型。 这些方法中的每一个都是失败的,因此初始化器被标记为throws,并在后台处理。 最后,我们调用成员明智的初始化程序,以使用成功向下转换的类型(第26行)构造我们的实例。 重要的是要确认,如果您的属性名称与json键的属性名称匹配,则只需要创建一个匹配的CodingKey即可快速神奇地构造您的实例,而无需定义初始化程序。 由于json通常不会采用这种方便的格式,因此此演示演示了完整的构建过程。 解析JSON 我们已经处理了Person实例的创建,但是请记住,所有person数据都可以通过json键“ person”访问 。 那么我们如何解析json来检索对象呢? 答案很简单:与上一节完全相同。 请注意,这一次我们只有一个[Person]类型的属性。 我们遵循与上一个示例完全相同的步骤,遵循Decodable […]

Swift 4集合类型

这个故事从根本上讲述了集合类型的声明和使用方法。 农历新年快乐2018 !!! 喔喔喔喔喔喔喔喔喔 有四种类型,包括: 数组 字典 组 元组 NSArray,NSDictionary,NSSet的Objective-C中的几乎所有方法都已迁移到Swift 4版本。 当然,由于SAFETY的Swift 4语言特性,对于那些刚从Objective-C那里碰到的人,会因快速声明的方式而有些恼火。 但是,它也可以让您实现更好的编码方式。 数组 var array1 = [1, 2, 3] var array2: [Int] = [1, 2, 3] var array3: Array = [1, 2, 3] 它们都是合法的书写方式,但是我将第二种格式清晰明了地指定。 字典 var dict1 = [“Dog”: 3, “Cat”: 5, “Rabbit”: 2] var dict2: [String:Int] = [“Dog”: 3, “Cat”: 5, “Rabbit”: […]

iOS生物识别本地身份验证

+ Shubaham Jain 实施TouchID身份验证 TouchID / FaceID是基于称为本地身份验证的框架的功能,该功能提供了用于从具有指定安全策略的用户请求身份验证的功能。 在应用程序中使用时,本地身份验证可以处理TouchID / FaceID的所有内容。 它将通过自定义消息提示您进行身份验证,该消息将告诉用户我们为什么需要身份验证,因此用户可以将手指放在主页按钮上。 本地认证框架 LocalAuthentication框架用于在iOS移动应用程序中实现TouchID或FaceID身份验证。touchId身份验证的使用基于本地身份验证框架。 为了实现touchId功能,我们首先在项目中添加了LocalAuthentication框架。 在项目导航中 ->选择目标->进入构建阶段->单击链接二进制文件与库->添加框架 在项目目标中添加LocalAuthentication Framework 现在我们可以编写代码了。 在AppDelegate类中,导入LocalAuthentication.framework 使用以下语句 @import LocalAuthentication; 下一步是要求框架通过评估策略功能可以将touchID应用于特定设备,它将接受两个参数,一个是我们要评估的策略名称,第二个是错误代码。 在App中实现TouchID时,请确定以下几种情况: Case 1 : Device is enabled with Biometric Sensor or not. Case 2 : At Least one Fingerprint is enrolled in device or not to check Biometric sensor availability. LAPolicy有两种类型, […]