Tag: 迅速

Swift中的强周期/保持周期

在进入“ 强/保留周期”问题之前,让我们非常简要地了解如何使用ARC管理对象内存。 ARC是XCode为我们提供的用于自动内存管理的编译时功能。 它代表自动参考计数。 简单来说,只有强引用计数变为“ 零 ”时,ARC才会释放对象 根据ARC内存管理,对象可以是带变量的strong, weak or unowned引用类型之一,将进一步讨论它们,目前,如果对象在let语句之前没有任何关键字,则默认情况下它将具有很强的参考意义。 let name = String() // name variable has a strong reference to instance of String 让我们用代码来理解, 上面的代码片段声明了一个名为Employee的类,其name, empid & title Empid name, empid & title为ivars。在第19行,我们创建了Employee类的实例jack ,并传递了所有employee的详细信息,因此jack变量具有对object的强引用。 根据ARC,具有至少一个强引用的内存管理对象将不会被释放/释放。 在第20行,我们取消了对对象jack的引用,该对象又释放或释放了它所引用的对象,这就是在释放对象之前如何调用Employee类的deinit()函数,正如我们看到的Employee: Jack removed.日志Employee: Jack removed. 我们先将参考添加到变量jack然后再将其取消。 “Where did the deinit log “ Employee: Jack removed ” go […]

快速关闭保留周期

保留周期发生在引用类型中,如类,闭包,因为物件互为强参考会造成记忆体无法释放到最后可能致使App崩溃 参考Apple文档自动参考计数自动参考计数(ARC) 小幅度,在使用closure时透过weak(弱参考可选)unowned(无主参考non-optional)来处理保留周期的问题 顺带一提:lazy修饰字,是因为closure中有使用self也就是这个类的本身,他必须先完成转换才能使用,而lazy会在重建完后,并在“初次”使用时才会执行,也只会改造一次。

在2019年为Swift开源做出巨大贡献

今年,我将每周发行一个新的开源项目。 我今年已经参加了五个项目: swift-sh :简单地运行具有第三方依赖项的Swift脚本。 Path.swift是一个令人愉悦的,健壮的,跨平台的和可链接的文件路径库。 LegibleError一个向用户显示较少 的 Swift错误的工具无法完成该操作。 (ThirdPartyModule。(0xx10d6b4a44的未知上下文.SomeError错误0.)) 更清晰易用 。 版本µ框架,用于表示,比较,编码和使用语义版本。 AppUpdater一个µ框架,用于根据您的仓库的GitHub版本更新您的开源macOS应用。 现在更新,八个: 工作台,粉笔,蛋糕。 你到底是谁 我是Max Howell,他是Homebrew的创建者,也是Apple的忠实拥护者,因为我13年前转而从事Linux开源工作以来。 我是开放源代码的多产和著名创作者,也是知名应用程序开发者。 我喜欢开发开发人员工具,因为: 开发人员工具是现代世界的基础 没有什么比让我为社区开发重要工具并帮助Swift掌控整个世界更快乐的了。 你会帮忙吗? 您是否会帮助我今年用52个模块化,设计良好的高质量 Swift软件包填补Swift工具包中的空白? 请支持我的赞助人: https://patreon.com/mxcl Max Howell正在创建开源| Patreon 嘿,我是马克斯。 现代世界的基础是开发人员工具。 我建立开发人员工具; 我想做… patreon.com 我的所有项目都首先在Patreon上宣布,让您有机会在其他任何人面前谈论它们。 更高级别的人员还可以访问我仅受邀的Discord,在这里您可以向我寻求API设计或一般Swift的帮助。 告诉我更多! 我已经整理了很多年的想法,我想将它们提供给Swift社区。 我所有的项目都有95%以上的代码覆盖率,100%的文档,出色的README并且都获得了自由许可(我现在偏爱Unlicense)。 我对API的设计一丝不苟。 在我心目中的最前沿始终是简单,优雅和力量之间的权衡。 工具应该易于学习,易于掌握并为掌握它的人提供动力 。 我关心您的开发人员经验,支持生态系统中的所有软件包管理器,自动更新文档,并在CI中对Swift支持的所有平台进行全面测试(是的,尤其是Linux)。 我虔诚地坚持语义版本控制,从不希望我的库在更新时或在更新Swift(或Xcode)本身时中断。 对于请求请求,我非常小心,我在乎我的产品,并避免出现功能膨胀:库应该精简而紧凑,并且知道其职责范围。 我从事Apple工具工作已有15年,是一位出色的移动应用程序开发人员,适用于所有平台,并且曾在Apple的Swift Package Manager初期工作。 我维护着许多世界顶级应用程序使用的前100个PodiseKit。 哦,我也创建了Homebrew。 我了解开发Swift应用程序的复杂性,过程,困难,障碍以及像您这样的开发人员需要改进的领域。 社区 我是开放源代码的创造者,管理过一些开放源代码最大的社区,并为数百个项目做出了贡献。 […]

你的超级力量又是什么?

正义联盟正义联盟将于今年11月上映,除了有超正的神力女超人外,各路超级英雄,合力拯救世界。 说到超级英雄,每个人都有他们的超级能力,我个人是很喜欢蝙蝠侠的… 没错,就是超级有$$$$$$$$$$$$$$$ 如果超级有钱,就能有各种酷炫超跑,私人飞机,甚至是自己的战机坦克…这次练习用Xcode里面的视图来拼拼凑凑,画出了8位的风格的蝙蝠侠。 这如果是用Illustrator来画,真是超简单的,大约5分钟就搞定了,但这次是第一次用Xcode练习,很多介面与操作上非常不熟,花了3小时吧…但也是个有趣的练习方式,有兴趣捧油可以到我的GitHub,瞧瞧我是怎么画的: mingsapp /蝙蝠侠 BatMan –使用“视图”在Xcode github.com中创建一个8位样式的Bat Man

迦太基的第三方依赖管理

依赖关系-它们是什么?如何使用它们? 软件开发的核心是软件重用,或者利用现有代码进一步开发新的和将来的代码。 正是基于这种心态,团队能够专注于眼前的问题,而不会浪费时间来重新发明轮子。 重用的代码可以是基础构建块,也可以只是方便使用的通用组件库,无论哪种方式,都不直接针对当前的问题。 这些组件称为依赖项。 用软件项目管理这些组件的集成称为依赖管理。 该过程具有与之相关的相关开销,这是不可避免的,但却是必需的。 在移动软件开发方面,以下是依赖性管理的几个选项,并在Compass上提供了有关如何管理依赖性的深入指南。 Git子模块 Git子模块是git存储库的原始依赖项管理器。 它们提供了一种定义应用程序使用但由项目存储库外部存储和管理的其他存储库的方法。 子模块是将依赖项添加到项目中的一种非常手动的方法。 它将从存储库中签出该代码,就是这样。 移动应用程序缺少此工作流,因为通过原始源代码使用已编译的库或框架要容易得多。 椰子足 Cocoapods是iOS和Cocoa应用程序的依赖项管理器,它抽象了依赖项管理的详细信息。 它下载依赖项并将其集成到Xcode工作区中。 让我们通过Xcode的工作区为您完成集成 Cocoapods最大的特点是,依赖项的自动化可能是其最大的缺陷。 在Compass,我们相信您永远都不应束手无策,而会厌倦神奇的解决方案。 依赖关系集成不是一件容易的事,最好不要假设它可以以一种适合所有命令的方式实现,请参见图A。 迦太基 迦太基是“可可的一个简单,分散的依赖性管理器” 迦太基不仅简化了子模块的工作,而且不仅通过检查依赖关系存储库,而且还将代码构建为易于集成的框架,使其可用于移动应用程序。 这就使框架集成工作留给了开发人员,消除了流程中的歧义和不必要的自动化。 在Compass,我们非常喜欢迦太基而不是Cocoapods。 迅捷软件包管理器 最后,我们有了相对较新的Swift Package Manager。 Swift Package Manager是用于管理Swift代码分发的工具。 它与Swift构建系统集成在一起,以自动化下载,编译和链接依赖项的过程。 Swift Package Manager正在发展声望,成为iOS依赖管理中的下一件大事。 不幸的是,由于严格限制仅使用Swift和其选择加入的性质,它尚未实现其成为主流的目标。 如果并且直到那一天到来,我们的团队将使用Carthage进行我们的所有iOS依赖关系管理,并强烈建议您这样做。

Swift中的高阶函数:Filter,Map,Reduce,flatmap,compactMap

据我了解,高阶函数是将另一个函数/闭包作为参数并返回它的函数。 我将首先尝试解释这一点。 考虑以下代码,这将使您了解什么是高阶函数: 将函数传递给另一个函数: 前两个方法的类型为(Double,Double)->Double 。 第一个接受两个double值并返回它们的和。 第二个返回这两个double值的乘积。 第三种方法是接受三个参数的高阶函数。 两个double值和一个类型为(Double,Double)->Double的函数。 看一下方法调用。 您将了解高阶函数的工作原理。 从另一个函数返回函数: 在这里,函数doArithmeticOperation(isMultiply:)是一个高阶函数,它返回类型为(Double,Double)->Double的函数。 函数和闭包是迅速的一等成员。 它们可以保存到变量中并传递。 因此,此处,基于传递给doArithmeticOperation(isMultiply:)函数的布尔值,它返回执行该操作的函数。 operationToPerform_1是为您执行乘法的函数。 operationToPerform_2是为您执行添加operationToPerform_2的函数。 只需看一下函数定义和调用即可。 您将了解所有内容。 当然,您可以通过许多不同的方式来做同样的事情。 可能是您可以使用闭包代替函数。 您可以创建一个算术运算枚举并简化该函数。 我只是想解释什么是高阶函数。 这是swift中使用的一些高阶函数。 如果我正确理解,以下函数将闭包用作参数。 您可以使用这些函数对Swift集合类型(例如Array, set或Dictionary 。 在进行以下操作之前,您应该了解什么是闭包。 阅读我关于闭包的文章 地图 使用 map 遍历一个集合,并对集合中的每个元素应用相同的操作。 map函数返回一个数组,其中包含对每个项目应用映射或转换函数的结果。 映射数组: 假设我们有一个整数数组: 让arrayOfInt = [2,3,4,5,4,7,2] 如果我们必须将每个数字乘以10怎么办? 我们通常使用for-in循环遍历每个数字,操作正确吗? var newArr:[Int] = [] 表示arrayOfInt中的值{newArr.append(value * 10)} print(newArr)//打印[20,30,40,50,40,70,20] 此代码看起来很冗长。 有一些样板代码,例如创建新的数组,可以使用map来避免。 如果我们尝试映射Int数组,则快速自动完成功能将显示以下内容。 […]

在Swift中减少– Khoa Nguyen –中

减少Swift 版本:Swift 3 您可以使用reduce组合集合中的所有项目(Array或Dictionary)以创建一个新值。 让我们看一下带有两个参数的reduce方法:initialResult和Combine闭包。 这是我们使用这种方法的方式: 如果您觉得很难记住,请使用以下解决方案: 它也适用于简短版本: 当我们使用循环而不是reduce: 您将看到使用函数式编程(在这种情况下,使用reduce )带来的更复杂的问题。 问题 :我有一个Product数组,每个元素都有3个属性:名称,价格,availableAmount。 我如何计算总价格和总可用量与reduce这个数组的所有元素? 在这种情况下,我使用Tuple作为初始值和返回类型 结果: 提示:如果您发现难以理解使用Tuple,进行reduce Tuple,回顾这张图片。 您可以使用循环重写此逻辑,并查看有多少行代码。 我并不是说您用更少的代码会看起来更加专业。 但事实是,您将提高工作效率并节省大量时间。 你喜欢这篇文章? 请分享! 懒输入代码-> Github上的Swift教程

使用中间类型在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中具有相同名称的键也是如此。 […]

使用弱和无人修复自我关闭内存泄漏

大家好,在本文中,我只想澄清一些困惑,为什么有时我们不得不在闭包块中使用[弱自我]或[未知自我] 。 通过简单的用例,我们将对此进行讨论。 让我们开始吧。 如你所知 取消初始化 当没有SecondViewController的保留周期时,将调用该函数。 因此,以上代码没有复杂性。 您是从其他使用UINavigationController的控制器来的。 当您按下后退按钮时,控制台将显示以下消息。 因为没有保留周期,也没有内存泄漏, 所以当您返回时, deinit函数将立即触发。 现在,进入一个复杂的案例。 假设SecondViewController将从应用程序的其他部分获取通知。 因此,您需要在NotificationCenter中注册。 我们可以通过两种方式实现NotificationCenter。 一种是将选择器传递给NC,另一种是Closure。 在这里,我要关闭。 在上面的代码中,我们从NotificationCenter接收到一条消息,该消息需要显示在infoLabel中。 如果运行以上代码,则控制台如下所示。 是。 它只是空的。 好。 让我做以下更改。 您只是评论了infoLabel的设置文本,并在日志中打印了新消息。 如果您现在运行代码,则deinit函数将触发,控制台将填充“ ==========我正在腾出我的空间==========” 哦! 这到底是怎么回事。 每当我们在闭包块中使用self时 ,实际上就是在创建一个保留周期。 这意味着它的secondviewconroller保留数量增加到两个。 即使您从SecondViewController返回,也只会减少一个保留计数。 因此,SecondViewController不会脱离内存。 如何解决这个问题? 在这里,我们有两个选择。 [弱自我] [无主自我] 弱者与无人者之间的基本区别 弱:弱引用使对其引用的实例保持弱引用。 这意味着ARC不考虑对实例的引用。 请记住,如果没有其他对象对该实例进行强引用,则该实例将被释放。 无主:无主引用类似于弱引用,因为它们不对所引用的实例保持强引用。 它们的作用与弱引用相同,即避免强引用循环。 总是期望无主引用具有值,而弱引用并不期望变量具有值。 您可以将nil分配给弱对象。 如果您想了解弱和无主之间的区别,请查看此链接。 要使用弱势修复此问题,代码将更改为以下代码。 我们在闭包的开头添加了[weak self] ,并为self添加了可选绑定 。 弱引用会一直存在,直到对对象的强引用出现为止。 这意味着它不会增加保留数。 […]