Tag: 编程

数据结构(基础知识)

数据结构是解决算法问题的有用工具。 您可能熟悉的两个数据结构是数组和字典。 数组具有内置的函数,可让您解决问题。 您可以对数组进行计数,对数组进行排序,将项目追加到数组中,在数组中的项目之间循环等等。类似地,您可以将键值对插入字典中,从字典中提取键值对,等等。 ,队列和树是另外三个对您的代码工具箱有用的数据结构。 堆栈 堆栈有助于按特定顺序组织数据。 堆栈可归为三大功能: 推动将新元素添加到堆栈顶部 弹出以从堆栈顶部删除元素 窥视堆栈顶部而不弹出 与您放在桌上的一堆纸类似,添加到纸堆中的最后一个元素是可以从纸堆中删除的第一个元素。 另外,就像您只能看到桌子上纸叠顶部的纸上内容一样,您也只能看到编码纸叠中的顶部元素。 如果使用字符串,上面的示例很好,但是如果要使用其他类型,该怎么办? 没有恐惧! 泛型在这里! 使用泛型堆栈 s列 类似于堆栈,队列有助于按特定顺序组织数据。 与邮局在队列中等待的第一个人是第一个离开队列并得到服务的人一样,代码队列中的第一个元素也是第一个离开队列的元素。 队列可归为三大功能: 排队将新元素添加到队列 出队以从队列中删除元素 偷看队列中的第一个元素而不将其从队列中删除 像堆栈一样,您也可以将泛型与队列一起使用。 树木 树有助于提高搜索效率,提供排序的数据列表以及使对象之间具有层次关系。 树木由三个元素组成: 节点是树结构中的数据块 根是树的入口点(零级节点) 叶子 (终端节点)是没有子节点的节点 由于树是由节点组成的,因此我首先创建一个Node类。 此类由值,Node类型的子级数组(有时还包括Node类型的父级)组成。 您可能想知道为什么我指定Node类符合等于协议。 为了在使用泛型时实现搜索功能,我不得不让Xcode知道Node类实际上可以执行比较。 如果您要以树的方式考虑上述测试,它看起来像这样: 您可能已经听说过专门的“二叉树”。二叉树是其中每个节点只有0,1或2个子节点的树。 二叉搜索树是一棵树,它从树中插入和删除信息,以便始终对树进行排序。 要了解更多信息,请查看以下链接: 二叉树 二进制搜索树 参考文献: https://github.com/raywenderlich/swift-algorithm-club

选择第二种语言:Swift To Python

为什么选择Python以及它的样子 Swift是开始工作的好方法。 我从来没有写过一行代码。 作为一个完整的编程初学者,花了13个月的时间进行设计,自学,编码,重新编码,然后启动我的第一个完整应用程序。 我为此感到无比自豪,这是人们每天都在玩的新颖游戏。 除了保持最新状态并推出新功能外,任务还很完整。 现在有这个东西。 一旦我变得根深蒂固地思考代码,就可以用这种技能来完成所有可能的事情。 在这种情况下,仅了解Swift的问题也变得显而易见。 尽管我喜欢Apple生态系统,但通过编写Swift代码,我只能覆盖50%的移动用户和不到4%的桌面用户。 我要编写的下一个软件是台式机软件。 这些是我主要为自己创建的程序,但是还有很多其他人可以从中受益。 如果用Swift编写它们,则只能覆盖4%的用户。 如果我用Python编写它们,几乎可以接触到所有人。 为什么是Python? 我可以达到更大的用户群。 有些工具在Python中可用,而在Swift中可能永远无法使用。 对我来说,那个库是Tensorflow。 有大量的稳定框架可用。 我可以为台式机,网络甚至移动设备编写Python。 不是说我会为手机编写它。 我可能不会,但是选项在那里。 您几乎要问的每个问题都已经在StackOverflow上得到了解答。 SO上的Python标签:〜596k。 SO上的Swift标签:〜100k 这需要多长时间? 比使用第一语言的时间要少得多。 几天之内,您就可以编写出基本的软件。 语法如何比较? 非常相似。 点表示法,函数参数以及您编写的许多代码看起来都一样。 空格是Python使一切保持秩序的方式。 您将不会使用方括号来打开和关闭函数或类。 这意味着,起初,一切都会看起来很杂乱。 最大的挑战是什么? 命令行。 我对命令行并不感到陌生,但是Python需要一定水平。 带有它的学习曲线可能会令人沮丧,但没有什么不同。 您做得越多,就越容易。 Python文档不那么友好,它没有像Xcode这样的强大IDE。 大多数语言都没有。 进行设置并习惯于新的IDE。 PyCharm是我的选择。 我设法从Xcode移植了大多数语法颜色设置和键绑定。 这是一个持续的过程。 如果您过于依赖UI的故事板,那么使用新语言会困难得多。 故事板可能很棒,但我建议在没有代码的情况下进行所有UI操作时,请不要使用所有UI。 编程界就是这样做的。 签出此内容以使用没有情节提要的面板,并查看代码中的布局对齐方式。 与其他IDE相比,Xcode中的自动完成和预测功能令人难以置信。 直到我开始为别人购物时,我才意识到自己有多依赖。 我输入的内容比使用Swift时要多。 我是否已经停下来质疑这是否是一个好的决定? 是。 但是到目前为止,只有一个原因。 […]

Swift解决方案:复合

复合模式涉及集合和单个对象的树层次结构。 在上面的插图中,我们有一个文件夹和mp3的目录。 文件夹仅包含文件数组。 每个文件夹的集合可以包含mp3和其他文件夹的混合。 该插图很好地对应于我们定义的每个部分: 层次结构->目录 收集对象->文件夹 单个对象-> mp3文件 它允许客户以相同的方式对待每个层次结构元素。 层次结构中的所有文件共享一个公共接口,而不管它是文件夹还是mp3。 例如,mp3和文件夹都是可以重命名,移动和复制的文件。 因此,可以合理地期望符合要求实现类文件行为的协议。 重要的一点是,客户可以统一对待小组和单个部分。 在使用每个文件之前,无需经常对其进行类型检查。 这是使元素派生自相同协议或基类的直接结果。 UML 组件 :为集合和单个对象提供公共接口的抽象。 树中的所有元素都必须派生自组件协议或基类。 基元 :以前称为“单个对象”。基元只是树中不包含子级成分的成分。 Composite :以前称为“集合对象”。Composite是包含组件数组的对象。 虽然Composite对象和Primitive对象共享相同的接口,但是Composites包含其他方法来管理其子级。 请注意:有几种方法可以引用我们的具体组件: 我个人更喜欢“复合”和“原始”这两个术语。接下来,让我们进入代码吧! 实作 在我们的示例中,我们将向公司部门分配奖金,最终将其发放给员工。 在这种情况下,部门和员工分别充当我们的组合和基元。 零件 protocol Payee { var name: String { get } var bonusAmount: Double { get } func receive(bonus: Double) } 首先,我们为复合对象和原始对象创建一个Payee协议。 这将是我们统一对待他们的手段。 雇员 class Employee: […]

Xcode 7离线视图

当使用情节提要板时,Xcode 7在Interface Builder中引入了许多改进。 情节提要参考 ,改进的Unwind Segues和Segue子类化是有用的工具,将有助于使用情节提要构建和维护复杂的应用程序。 有关这些主题的所有详细信息,可以在WWDC 2015的“故事板的新增功能”部分中找到。 在此会话中强调的一项重要的小功能是能够在任何视图控制器的场景基座中添加“脱机视图”。 如果您需要呈现一个仅在其容器视图控制器显示后才显示的复杂视图,那么您很可能使用了以下两种方法之一: 在单独的xib文件中定义视图并加载它,如下所示: 让myView = NSBundle.mainBundle()。loadNibNamed(“ MyViewNib”,所有者:self,选项:nil).first! 如! UIView self.view.addSubview(myView) 将视图定义为容器视图控制器层次结构的一部分,可能使用alpha = 0或在主视图范围之外,然后响应某些事件而显示视图。 使用单独的xib文件方法,我们必须使用上面的代码以编程方式加载视图。 如果需要将IBAction和IBOutlet直接链接到视图控制器,则可以通过将视图控制器类指定为xib文件的文件所有者来实现。 尽管这可行,但它需要几个配置步骤,如果我们可以在其视图控制器旁边看到该视图,并且能够直接链接IBAction和IBOutlet,那就更好了。 所有这些都可以通过将视图直接添加到IB中的视图控制器的层次结构中来完成,但是最终我们可以将多个视图彼此并排堆叠,并且在视觉上由于它们彼此重叠而变得难以使用。 离线视图通过将所有内容保留在同一画布中,同时清楚地显示视图控制器及其离线视图,从而大大提高了故事板的清晰度: 要将离线视图添加到视图控制器,只需将UIView(或子类)拖到视图控制器场景停靠区中,它将显示在其上方。 同样,可以根据需要添加多个脱机视图并将其链接到视图控制器。 新添加的视图可以通过CTRL +拖动到View Controller的源文件中,作为IBOutlet链接: 显示视图 如果编译并运行该应用程序,即使调试器显示已设置了相应的IBOutlet,也将看到该视图不可见。 这是因为离线视图不会自动添加到视图层次结构中。 为了显示视图,我们需要自己添加它(例如,在@IBAction方法内部): self.view.addSubview(offlineView) 如果再次构建并运行,我们将看到该视图出现在主视图的左上角,并且其大小与在“界面”构建器中指定的宽度和高度匹配。 查看尺寸 以上所有都是很棒的-但是如果我们希望离线视图成为与其超级视图范围相匹配的叠加层,该怎么办? 从Xcode 7.0 beta 3开始,无法告诉IB添加后,脱机视图应扩展到容器视图,因此我们需要以编程方式进行此操作。 幸运的是,我们的朋友自动版式可以为您提供帮助。 我们可以编写一个简单的UIView扩展类,以将所有视图锚点约束到其超级视图边缘。 有关如何完成的信息,请参见本要点。 有了这个扩展,我们的视图可以像这样锚定到超级视图的边缘: self.view.addSubview(offlineView)//这是我们的@IBOutlet offlineView.anchorAllEdgesToSuperview()// UIView扩展方法 警惕的读者会注意到,以编程方式添加约束时,translatesAutoresizingMaskIntoConstraints设置为false。 WWDC 2015的第2部分“自动布局的奥秘”部分对此做了很好的解释。 结论 脱机视图是Interface […]

如何拆卸大量Singleton iOS应用

一生中至少有一个iOS开发人员至少从一个年轻的人或其他人那里继承了一个遗留项目,而当iOS开发成为独立开发人员的黄金竞赛时,其他人曾编写过代码。 那时,我们中只有少数人关心测试,可测试性,体系结构或模式。 只有大量的视图控制器,关心限制崩溃的数量,关心无限数量的功能和单例。 有很多单身人士。 Singleton非常容易用Swift中的1行代码和Objective C中的5行代码来实现,易于从应用程序中的任何地方调用,并且最好是弄乱代码以防止单元和UI测试。 本文的目的是为您提供一种有效且快速的工具,以解开任何单身汉,无论数量多少。 我将使用一个代码片段来给出我上面所描述的示例,并模拟3个单例服务和一个示例视图控制器。

Swift 4 Introduction系列1.5 — Swift数据类型元组

通过将2个或多个基本数据类型分组为单个复合数据类型来形成元组。 元组的每个元素可以是任何Swift基本数据类型。 元组中的每个元素之间的数据类型可以不同。 由于元组可以包含许多不同的类型,因此我们可以从任何类型的排列中创建元组。 元组不适合复杂和持久的数据结构。 对于复杂而持久的数据结构,我们应该使用结构或对象类。 要创建一个常量元组,我们使用相同的关键字let,然后使用关键字var来创建变量元组。 常量和变量的行为与Swift基本数据类型相同。 常量是不可变的,变量是可变的。 我们可以用字符串和整数组成一个元组,如下所示: 让contact =(“我的名字”,22341176) 要访问元组中的元素,我们使用从0开始的索引。 例: 0 接触1 像往常一样,我们也可以通过先声明一个元组来创建一个元组。 我们只需要将所有不同的数据类型放在方括号中即可,并用逗号将它们分开。 例: 让address1 :(字符串,字符串) address1.0 =“ A座公寓” address1.1 =“新泽西州” 地址1.0 地址1.1 请注意,尽管我们可以先声明常量而不分配数据。 这不是最佳实践。 为了声明常量,我们应该在同一条语句中声明并分配它们。 这是为了使我们的代码更安全。 我们只应声明元组,然后在绝对必要时分配数据。 对于变量,即使我们没有要输入的数据,也应首先声明和初始化变量。 创建元组变量的首选方法是使用以下方法同时创建和初始化变量。 var contact1 =(String(),Int()) contact1.0 contact1.1 contact1.0 =“这是一个测试” contact1.1 = 2132 contact1.0 contact1.1 contact1.0 =“大卫” contact1.1 = 76788779 contact1.0 contact1.1 对于元组中的每个元素,我们可以具有相同的数据类型。 […]

如何避免协议导向沉迷于编程

大约一年前,我正在观看2015年的WWDC视频,当时一次特别的会议演讲引起了我的注意。 似乎引起了所有人的注意。 鉴于在过去一年中创建了与Swift相关的内容,许多人已跃入全新的编程范式。 我当然是指大卫·亚伯拉罕斯(David Abrahams)提出的有关面向协议的编程的精彩演讲。 如果您还没有看到它,并且使用Swift编写应用程序,那么绝对值得一试! 认真地做吧。 接下来的事情并不是试图减轻演讲中所呈现的内容的酷感。 如果正确应用协议扩展,它将是一个很棒的工具,它具有许多实际用途,我们将在本文的最后进行介绍。 问题是我们所有人都感到内gui(绝对包括我自己)。 当您拥有闪亮的新锤子时,一切都将变成钉子。 因此,在过去的一年半中,协议一直在敲定,我们的项目是钉子。 我们学到了什么? POOP的起源 它总是以一种天真的渴望学习新事物而开始。 与在圣诞节打开Nintendo 64的包装并整夜陪同兄弟姐妹玩Goldeneye并没有什么不同。 是的,我知道那与我约会的时间。 协议定向痴迷编程是过度使用协议扩展需求的产物,尤其是在不需要它们的情况下。 POOP是对令人敬畏的新工具的一种完全可以理解的反应,但是正如我之前所说的,在编程中所做的任何事情总会有取舍。 仅查看收益是远远不够的。 我们必须始终考虑成本。 那么面向协议编程的权衡是什么? 为什么我们要避免将所有内容重构为协议和协议扩展的冲动? 是什么使POOP便便? 一切都取决于 代码的 可读性 。 痴迷于协议定向的编程如何危害代码的可读性。 与开发人员团队合作时,有效的沟通是成功的关键。 可读的代码可导致更好的沟通。 不可读的代码使团队工作变慢,因为每个人都需要更多时间来弄清楚它的作用。 作为团队中的开发人员,您应该始终努力减少代码对同事的认知负担。 拥有可读的代码不仅仅意味着选择正确的类和函数名称。 与在单个位置中显示适当数量的信息有很多关系。 另一个开发人员应该只查看一个文件就可以弄清楚代码的作用。 这个有一个名词。 我们称其为本地推理。 这意味着人们应该能够推理您的代码,而不必到处移动太多。 它是一种支持预先的显式代码的设计哲学。 当您出于保留局部推理的目的而编写代码时,尝试避免使用复杂的类层次结构和设计,这些层次结构和设计迫使其他开发人员从一个文件跳到另一个文件,只是为了清楚地了解代码的作用。 协议定向痴迷编程是有问题的,因为它使本地推理几乎不可能。 为了更好地理解为什么会出现这种情况,我请您取悦 惊人的爆炸结构 假设您有一个基本的Milkshake结构。 它具有您可能熟悉的一些变量和功能。 现在我们可能不一定同意授予Milkshake结构的功能,但是我们可以同意这里有可读的代码块。 就是说,所有这些都为我们阐明了。 我们不需要去其他地方去了解这个结构的作用。 很容易推理。 如果我们将奶昔的一部分重构为一些单独的协议,将会发生什么? 好吧,这并不可怕。 从技术上讲,它仍然像我们的其他结构定义一样工作。 不幸的是,它的可读性差得多。 […]

Xcode中的花哨字面量

文字 今天,我将向您介绍Swift中可用的一些奇特的文字。 它们可以帮助您简化Swift程序员的生活。 首先,让我们解释一下“文字”一词​​实际上代表什么。 根据维基百科 : 在计算机科学中,文字是用于表示源代码中的固定值的符号。 这意味着在Swift中,以下论点是正确的: 让someNumber = 1 // 1是文字 let someString =“生日快乐” //“生日快乐”是一个文字 让optionalBool:布尔? = nil // nil是文字 通常,文字是程序员直接键入的值。 多年来,我们在其他编程语言中都有这种文字,因此,在Swift中这并不是什么前沿技术。 但是,并非所有人都知道Xcode还提供了颜色和图像的文字。 颜色文字 考虑一下您在代码中编写了多少次这样的代码: 让someShadeOfGreen = UIColor(红色:25/255,绿色:210/255,蓝色:95/255,alpha:1.0) 好的,也许您比我聪明一些,并且您已经为UIColor编写了自己的初始化程序,所以您不必每次想创建UIColor对象时都用255和alpha编写此奇怪的除法。 无论如何,它仍然不能使您对这种颜色有任何了解。 我为这个变量命名,所以我可以假设稍后再回到这部分代码后,它有些绿色。 但是,您知道,“ 灰色的五十道阴影 ”中的五十个字是有原因的。 有很多。 值得一提的是,Color Literals派上了用场,它使我们可以将值分配给UIColor变量并预览结果。 您只需开始在编辑器中键入colorliteral即可使用Color Literals 。 然后,将显示预览。 双击可以从调色板中选择所需的任何颜色,也可以只键入适当的RGB值: 我认为这是在代码中创建UIColor对象的不错选择。 图片文字 Xcode中另一个可用的奇特文字是Image Literals。 它们的工作方式与Color Literals类似。 让我们讨论一种创建UIImage对象的经典方法, 该对象包含资产中的一些图像: 让pepeImage = UIImage(命名为:“ […]

XCode iOS版新游戏-第1部分

Pre guntas porque en los视频教程,没有重要的解释性的los复选框,opciones y otras cosas que aparecen al inicio de un proyecto en Xcode… Muchas veces cuando iniciaba在Xcode上使用了程序化的iOS应用程序,并在comenzaban con algo como上播放了视频教程: “ Iniciamos el proyecto pulsando 创建一个新的Xcode 项目,seleccionamos Single View Application ,ponemos x nombre yces 连续式”我的预告片是“¿? “ Bien empecemos por laprima vista al abrir Xcode y si no conoces parkaún,descubrirásla mina de […]

适用于Swift开发人员的Python

我什至尝试了一下,但并没有太认真,但是这次我向自己保证,我将彻底探索该语言。 它把我吹走了! Python仅需几行代码即可为您提供强大的功能。 几行代码,您正在绘制一个UI,其中包含一个窗口和几个在OSX,Linux和Windows中运行的控件。 再加上几行代码,就可以像这样以2D渲染游戏。 Python语言 有人声称Python和Swift非常相似。 我会说它们是完全不同的,但是在某种程度上,Python在编写代码时似乎非常熟悉。 我发现的第一个区别是Python使用的数据类型是: 整数,浮点数,字符串,复数,布尔值,元组,列表,字典和集合。 除了复数(这是我看到的第一种语言,它本来就支持它,这似乎很奇怪,因为除科学家们以外,它们没有被广泛使用,尽管很酷),它们都是Swift程序员非常熟悉的数据类型因为我们使用了所有这些,尽管可能有些不同。 Python并不使用带有方括号{}的块,而是一种非常聪明的方式,使块位于缩进内部。 在Python中,缩进内置于解释器中。 属于代码块的代码必须缩进,否则会收到错误消息。 这是使Python特别可读的功能之一。 Python非常直观,使用诸如PyCharm Community Edition之类的IDE可以非常轻松地调试代码并了解程序中正在发生的事情。 徽标作家回来了! 在1980年代,我还是一个孩子的第一步就是使用Logo Writer完成计算机和编程方面的工作,在学校里用乐高积木和所有这些东西建造机器人。 这一切对我来说似乎都是神奇而令人兴奋的,我每天都会去实验室尝试学习新事物。 我不得不承认,当我发现Python拥有一个名为Turtle的超棒库时,我有点感动,该库基本上模仿了我成长时用来绘制的Logo Writer turtle。 类和对象 作为现代语言,Python是一种具有面向对象编程能力的语言,并允许其用户创建类和对象。 输出 : – [Johhny,41] – 他们是一样的 在Python中,您可以像在Swift中一样创建对象。 它们有一个构造函数(在某种程度上类似于第4和第5行中描述的Swift构造函数)。 在python中,您不必声明对象的成员变量(只需像第4行那样访问它们,它们就会自动创建,即self.name =’mortimer’ 在Swift中,您可以覆盖运算符! 耶! 您可以覆盖==,+,,*,无论您想要哪个! 在此示例中,我重写了等于运算符 就像我们在Objective-C和Swift中所做的那样,您可以声明一个描述符方法,并输出一个友好的类描述,您可以在Python中执行相同的操作: var description: String { return “-[” + self.name + .. + “]-“} 在第15行中,我编写了一个简单的描述符,用于调试Person类,该描述符实际上在第18行中使用。 […]