Tag: swift

探索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是位于佛蒙特州伯灵顿的尚普兰学院的计算机科学与创新助理教授。

迅捷每周提示— IV

大家好, 我们正在共享“快速每日提示”包。 每周提示列表 默认参数 懒惰的财产 可丢弃的结果 返回多个值 物业观察员 公私(套) 三元运算符 如果您想分享技巧,则可以从GitHub打开请求请求。 您还可以阅读 每周 I, 每周II 和 每周III 。

使用Swift实现基于堆的优先级队列

在计算机科学中存在很多问题,其中使用优先级队列作为基础数据结构可以极大地提高算法的时间复杂度。 Dijkstra的最短路径算法就是一个例子,该算法使用优先级队列在图形中搜索两个顶点之间的最短路径。 遗憾的是,Swifts标准库没有默认的优先级队列实现,因此我们将研究如何自行实现基于堆的优先级队列。 要继续使用自己的IDE,请 单击此链接 以获取源代码 ! 什么是优先队列? 优先级队列是一种数据结构,可以对具有相对优先级的对象进行有效的排序。 您可以将一堆对象放入队列,然后根据它们之间相互比较的重要性将它们一一递回。 假设您已经为计算机创建了许多任务,以便它们在将​​来的某个特定时间运行。 将它们添加到优先级队列将使您的计算机使任务出队,并在仍在等待其截止日期的任务之前获得应执行的对象。 为了实现我们的队列,我们​​将使用堆结构! 什么是堆? 可以将堆看作一棵树,其中每个节点最多有2个子节点。 堆还具有以下限制:它需要将所有新节点添加到顶层,并尽可能地添加到最左边。 看一下下面的图片: 堆还维护与每个节点的相对大小有关的属性。 最小堆(这是我们将要使用的堆)保持以下属性:每个节点都小于其两个子节点,而最大堆则相反。 为了能够维护此属性,我们将需要进行一些操作以获得正确的节点顺序。 当我们插入一个新节点时,我们将其添加到树顶部左侧的第一个可用位置。 如果完成此操作后min min属性不成立,我们将开始与该节点的父节点交换节点,直到达到再次拥有min堆的状态。 下图显示了将2插入到现有的最小堆中时发生的情况:

Swift中鲜为人知的功能

数组 这是使用数组文字语法或完整类型名称语法声明数组时获得的默认数据类型。 此数组类型已针对在Swift Array和NSArray类型之间进行转换进行了优化。 让水果= [“苹果”,“猕猴桃”,“梨”] 让空= Array () 它是迄今为止Swift标准库中使用最广泛的数组类型。 并且由于与Objective-C的自动桥接,对于大多数返回数组的API类型,这是推荐的选择。 这样,API的使用者就不必担心会返回意外的类型。 如果数组的元素已经是class或@objc协议的实例,则从Array桥接到NSArray会占用O(1)时间和O(1)空间; 否则,将花费O( n )时间和空间。 但是,我们确实有其他一些类型的数组,在某些情况下可能会有用。 检查标准库中一些常用功能的实现以深入了解Swift的作者如何实现这些功能以及它们利用的数据类型类型是很有趣的。 连续数组 三种阵列类型中最快的。 ContiguousArray始终将其元素存储在内存的连续区域中(就像C旧式数组一样)。 这与标准Array类不同,后者可能根据元素类型使用连续内存或NSArray实例。 如果要存储class或@objc协议类型,而无需桥接到Objective-C或调用Objective-C API,则ContiguousArray通常会更快。 实际上, ContiguousArray在Swift标准库中出现了41次。 grep “ContiguousArray<” * | wc -l ContiguousArray有几种有趣的用法,例如, Sequence上的Swift的map和filter函数使用ContiguousArray作为其实现的一部分。 让我们看一下标准库代码。 Swift标准库中的地图和过滤器 由于我们在每个元素上使用map / filter函数,因此我们预先知道数组的大小。 声明一个大小为ContiguousArray的数组,可以避免在处理map函数时扩展数组以容纳更多元素的需要。 这是效率优化。 只有在填充数组超出初始容量后,我们才使用Swift的append函数,该函数会根据需要自动调整数组的大小。 数组切片 ArraySlice类型使您可以快速有效地对较大数组的各个部分执行操作。 ArraySlice提供与Array相同的接口,允许大多数阵列操作。 ArraySlice通过在现有阵列的一部分上显示视图来实现此目的。 这使您可以执行诸如将数组拆分为不同部分的操作,而无需实际创建新数组或复制数组元素。 luckyNumbers = [38,38,41,4,35,15,41,42,12,29,15,55,69,76,25,13] 让中点= luckyNumbers.count / 2 让firstHalf […]

一块免费的源代码

我们在我们的网站Piece中引入了免费源代码。 您可以免费下载源代码,并将代码集成到您的应用程序中。 请在片上签出免费源— https://www.piece.cool/products/free 1.斐波那契数列发生器 该应用程序从您指定的斐波那契数列中生成数量的数字。 它可以将结果记录在一个文本文件中。 有关更多详细信息,请参阅— https://www.piece.cool/products/view/227 2.实时十六进制Bin Dec转换器 ·此应用程序实时转换不同基数的整数。 ·只需在一个字段(十进制,十六进制,二进制或八进制)中键入或粘贴一个整数值,它将被转换并以其他格式实时显示。 将空格添加到显示的值以使其更易于阅读。 ·应用程序使用angular的两种方式绑定来实时显示结果。 由于需要处理这些值,因此我们对要显示的每个属性都使用了一个getter和setter方法。 ·例如,通过在调用“ Convert()”方法时修改参数,可以非常容易地将显示格式从八进制更改为以6为基数。 有关更多详细信息,请参阅— https://www.piece.cool/products/view/272 登录到Piece并享受免费的源代码,以用于学习目的或用于您的业务系统。 如需任何帮助/查询,请通过https://www.piece.cool/contacts或通过info@oneact.jp发送电子邮件与我们联系。 件管理系统

NSOperation和NSOperationQueue可以改善iOS中的并发性

通过谢尔盖·沙巴林(Sergey Shabalin) 作为我的文章“ iOS并发性简介”的后续,今天,我想分享我对如何提高iOS应用程序中的并发性水平的看法。 操作可以并发提供帮助。 操作是作业封装的一种面向对象的方法,该方法可以异步完成。 应该将操作与操作队列结合使用或独立使用。 操作对象是用于所需作业封装的Operation类实例。 Operation类本身是一个抽象类,出于实用程序的目的,该类将由子类实现。 让队列= OperationQueue() queue.maxConcurrentOperationCount = 2 let operation1 = BlockOperation(block:{ … }) operation1.qualityOfService = .userInitiated let operation2 = BlockOperation(block:{ … }) operation1.completionBlock = { … } operation2.completionBlock = { … } operation2.addDependency(operation1) queue.addOperation(operation1) queue.addOperation(operation2) OperationQueue类调节操作对象集的执行。 添加到队列后,该操作将保留在该队列中,直到完成或取消。 队列中的操作根据其优先级和操作之间的依赖性进行自组织。 如果队列中的操作具有相似的优先级,则按照FIFO原理执行它们。 操作支持以下基本特征: 依赖关系,防止操作在之前的操作完成之前开始。 支持附加完成块。 使用KVO监视操作状态的变化。 支持操作优先级并影响其执行顺序。 取消选项,允许在执行时停止操作。 如果操作不能完全满足应用程序的需求,则可以创建NSOperation子类以添加缺少的功能。 进口基金会 class […]

Swift中的可选-了解原因

Swift带有可选和非可选变量的新概念。 在回答为什么是可选的? ,您需要快速了解什么是可选的? var someOptionalString:字符串? // 可选的 var nonOptionString:String =“ 123” //非可选 那是? 在声明中意味着什么? 好吧,这是一种快速声明可选变量的方法。 好。 但是,这是什么可选内容? 可选的是一种表示变量中是否有值或什么都不表示(即没有值)的方法。 从上面的代码, someOptionalString可选变量,我们可以得出结论,它可以包含一些字符串值,也可以根本不包含任何字符串值。 迅速地, nil是一个特殊值,表示没有值。 因此, someOptionalString可以包含字符串值,也可以为nil 。 好。 到目前为止很清楚。 但是为什么是可选的 ? 让我用示例解释一下: -(NSString *)getFormattedPhone:(NSString *)phone { 如果(phone.length == 10){ NSString * countryCode =“ +91” 返回[NSString stringWithFormat:@”%@-%@”,countryCode,电话] } 返回零; } NSString * formattedPhone = [self getFormattedPhone:@” 2233231341223“]; //返回nil […]

快速了解所有协议

资源 : 苹果文件 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 因此,简单起见,一个协议会说一个struct,class或enum,如果您想成为THAT ,请执行此操作,然后再执行此操作。 例如:如果您想成为人类,则必须饮食,睡眠和休息。 类,结构体,枚举可以通过将协议名称放在类型名称后(用冒号分隔)作为其定义的一部分来采用这些协议。 可以列出多个协议,并用逗号分隔: 如果一个类具有超类,请在其采用的任何协议之前列出超类名称,然后用逗号: swift和Objective-C都支持多级继承。 它只能有一个单一的基类。 两者都不支持多重继承。 如上图所示,仅支持协议的多个继承,以逗号分隔。 您可能已经看到UIViewController的实现UITableview datasource和delegate协议。 class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { } 虽然,最佳实践是将其分组在ViewController的单独扩展中并实现协议。 class ViewController: UIViewController {} extension ViewController: UITableViewDataSource, UITableViewDelegate //implement protocol methods ands variables here.. extension ViewController: UITableViewDataSource, UITableViewDelegate //implement protocol methods ands variables here.. 协议可以具有属性以及符合该协议的类,枚举或结构可以实现的方法。 协议声明仅指定所需的属性名称和类型。 它没有说明该属性是存储的还是计算的。 协议还指定每个属性必须是可获取的还是可获取的和可设置的。 属性要求始终声明为变量属性,并以var关键字为前缀。 […]

在Swift中记录

我们没有任何借口:记录我们的代码从未如此简单。 Swift工程师做了出色的工作,为我们提供了一种众所周知的简单方式来保持我们的代码记录:标记语言。 我制作了一个信息图,为您提供实现此目的最有用的技巧。 以下是简要概述。 我们需要知道的所有内容可以通过两件事进行综合:如何格式化以及Swift如何组织和显示文档。 如何格式化 我们几乎可以使用任何markdown语法在Swift代码中格式化我们的文档:预定义的标题,强,斜体,项目符号列表,编号列表,链接,嵌入式代码等。 Swift如何组织和显示您的文档 Swift使用以下部分按此顺序组织方法的文档(我们只需要使用正确的关键字来激活可选的关键字即可): 说明(默认):在这里我们可以指定很多东西:作者,版权,警告,注释,版本等。 参数(可选) 退货(可选) 抛出(可选) 例如: 然后,在Option上单击我们的方法或在实用工具栏中选择询问标记时,将显示格式化的文档: 我们还可以使用一些注释标签来分隔代码: //标记: // 去做: // 整我: 例如: 这将显示在我们代码上方的栏中: 我们可以使用Jazzy以精美的方式呈现文档。 坦白地说,为了我们的团队成员或将来的自己,每个人都应该这样做,因为从现在开始的几个月内,他们将与我们自己的代码取得联系。

iOS中的线程[第1部分] GCD —快速方法

线程是iOS中重要的核心概念。 作为程序员,了解线程如何工作以及如何利用它非常重要。 启动应用程序时,它将在主线程或UI线程上运行。 如果尝试在主线程中执行耗时的任务,它将阻塞UI,这意味着UI会停止响应一段时间,从而给用户带来糟糕的体验。 为了避免这种情况,我们可以使用多线程在其他线程中执行耗时的任务,从而不会阻塞UI。 假设您在viewDidLoad()中有一个函数需要花费5秒钟以上的时间来完成和更新您的集合视图。 在此,UI将被阻止至少5秒钟,并且不会显示集合视图。 这是一个坏习惯。 耗时的任务应在其他线程(后台线程)中执行。 快速地,我们使用GCD-中央分配器来访问线程。 快速地,有不同类型的线程: DispatchQoS-服务质量,它确定线程中任务的优先级。 让我们看看如何在线程中运行任务。 重要的是您需要始终在主线程中更新UI。 否则,可能会导致崩溃 这是快速线程的基本工作。 一旦了解线程如何工作,就可以深入研究它。 如果您喜欢阅读这篇文章,请分享并鼓掌。