Tag: 编程

Swift中的二叉搜索树

从以前的帖子: 在Swift中使用数据结构 因此,基本上我们已经学习了数据结构并在C / C ++中实现。 在这个故事中,您将看到学习一些基本数据的方法。 因此,我也前进到也要在二进制搜索树上进行写操作。 二进制搜索树是满足以下属性的树: 1.左子树中所有节点的值均小于根节点中的值。 2.右子树中所有节点的值都大于根节点中的值。 3.根节点的左和右子树也是BST。 要从这些遍历手动构建树,请遵循以下https://crackinterviewtoday.wordpress.com/2010/03/15/rebuild-a-binary-tree-from-inorder-and-preorder-traversals/ 正在搜寻 搜索机制类似于上面提到的具有相同2条规则的插入机制。 仅当节点数据与输入元素匹配时,它才会成功返回, 否则将返回无效消息,如下所示。 func search(element:T){…} :可供用户搜索元素。 private func search(_ rootNode:TreeNode ?, _ element:T){…} :这是将搜索元素的递归函数。 因此,如果element> rootNode.data ,它将递归调用根的右子树节点, 否则调用左子树节点。 由于树中存在E节点,因此返回成功结果NODE FOUND:E 。 由于没有节点包含等于N的数据,因此返回INVALID NODE:N 。 因此,这是泛型树的概述。 希望您对泛型有更多的了解。 在下一个故事中,我们将讨论最后一种遍历类型:Level Order Traversing😄……敬请期待😜!!! 使用Swift在BST中进行级别订单遍历 让我们先回顾一下, 然后再开始… medium.com 快乐编码😃!

在移动文本冒险中为OOC事件创建框架

编码开始:Systers的GSoC 我已经开始上一堂课,为我们的游戏PowerUp处理故事序列。 我认为它更多的是设计挑战,而不是编码挑战。 我想确保它易于使用,并且对其余应用程序功能的影响最小。 我希望其他人认为“嘿,还不错。 我可以为此创建内容并添加它。” 所以这是清单: 应该可以将其添加到应用程序中任何位置的视图层次结构中,并且这样做应该尽可能简单。 序列应可自定义,但数据模型应易于阅读和设计。 繁重的工作将由班级本身来完成。 另一个开发人员不需要三页的Wiki即可实现序列。 这没什么大不了的,但是需要正确地做。 我绝对不喜欢复杂的代码模式,这些模式会使很酷的工具体积庞大且无法使用。 1为了使它易于使用并立即被其他iOS开发人员所熟悉, StorySequencePlayer是UIView的子类。 即使类是控制器,也不必是UIViewController。 该计划是通过将视图呈现为叠加层并在完成呈现内容后使用委托来处理解雇来简化其生命周期。 在外部,唯一添加到现有视图控制器的代码应该看起来很熟悉: //获取模型,初始化并添加到视图 func startSequence(){ 警卫队让模型= getTheModel()其他{返回} let view = StorySequencePlayer(代表:自我,模型:模型) self.view.addSubview(view) } //取消最后一步时调用此委托方法 func sequenceDidFinish(发送者:StorySequencePlayer){ sender.removeFromSuperview() }

诠释比Lewis Carroll更深入:Python故事

我们不是只是建立实例获得自己的唯一ID吗? 那整数是对象吗? 和弦一样吗? 为什么这些具有相同的ID? 答案在于可变性。 变异性 字符串一旦声明就无法更改。 尝试一下: 字符串是不可变的 。 整数,浮点数和元组也是如此。 在Python中使用不可变类型时,解释器通过将多个变量分配给同一对象来节省空间和时间。 由于我们不能更改“ dog”,为什么当我们说a =“ dog”和b =“ dog”时将其复制两个? 只需将两个指针分配给同一只非常好的狗即可。 另一方面,列表可以更改,并且经常会非常频繁地更改。 因此,可变类型会获得单独的对象,而不变对象则不会。 您也可以使用“ ==”和“ is”操作进行验证。 检查a == b会告诉您两个对象是否具有相同的值,而a == b会告诉您两个对象是否具有完全相同的id。 看起来像这样: 好吧,让我们再次加深对此的理解: 我们不是只是说字符串是不可变的吗? 如果a和b都是不可变的字符串,如何将它们添加到c? 答案再次涉及效率。 注意那里的c的ID是如何变化的。 Python没有改变c。 它将c 重新分配到一个可以容纳我们想要的所有字符串的新位置。 此过程称为串联。 它也适用于整数。 在C语言中,我们可以讨论如何通过值 (给函数提供数据的副本)或通过引用 (给函数提供实际数据,然后可以更改)将数据类型传递给函数。 那么,用Python处理什么呢? 正如您所怀疑的,答案与变异性有很大关系。 如果您传递一个函数,例如一个int,它将传递该值。 这基本上意味着该函数将创建一个新实例,无论您赋予它什么值,然后使用它。 值不变,ID不变。 您可以猜测可变列表会发生什么。 正如标题中所承诺的那样,让我们​​结束一些有关整数的有趣事实。 当然,它们是一成不变的。 如果您说a = 1,b = […]

Swift内存布局:大小,步幅,对齐

Swift结构实例的内存布局的基础知识。 Swift类型在内存中处理时要考虑三个属性:大小,步幅和对齐。 尺寸 让我们从两个简单的结构开始: struct Year { let year: Int } struct YearWithMonth { let year: Int let month: Int } 我的直觉告诉我, YearWithMonth的实例比YearWithMonth的实例更大(它占用更多的内存空间)。 但是我们是这里的科学家。 我们如何用硬数字验证直觉? 内存布局 我们可以使用MemoryLayout类型来检查一些有关类型在内存中的外观的属性。 要从结构的类型中查找结构的size ,请使用size属性以及通用参数: let size = MemoryLayout.size 如果您有该类型的实例,请使用size(ofValue:)静态函数: let instance = Year(year: 1984) let size = MemoryLayout.size(ofValue: instance) 在这两种情况下,大小均报告为8个字节。 毫不奇怪,我们的结构YearWithMonth的大小为16个字节。 回到尺寸 结构的大小似乎很直观-计算每个属性的大小之和。 对于这样的结构: struct Puppy { let age: Int […]

在Swift中使用数据结构

我们都学习了数据结构,并以C / C ++实现。 在这个故事中,我将迅速说明一些使用泛型的基本数据结构。 让我们从堆栈开始。 注意:这个故事只是一个想法,重点在于基础知识。 欢迎提出建议和改进。 什么是堆栈? 我们都知道这是对的! 仅供参考,这是一个简单的例子– 我将定义一个可以推送/弹出任何类型对象的Stack类。 为了方便起见,我假设这些对象将确认为CustomStringConvertible协议(以便我可以打印其描述) Stack :CustomStringConvertible 这是使用泛型对象T的简单类声明 在单个链接列表中,第一个节点将是开始/根节点,下一个节点将是nil 。 创建一个班级名称 类LinkList :CustomStringConvertible,其中T:可比较,T:CustomStringConvertible 问:为什么在这里要求可比 ? 答:在搜索特定节点的情况下,我需要比较元素。 因此,为了进行比较,链接列表中的元素应符合可比较协议。 如上所示,声明称为startNode的私有节点。 注意:在这里假设理想情况,您可以管理空/零情况 append:此函数将在列表末尾添加元素。 如果链接列表为空,那么将要添加的第一个元素将是起始节点。 insert:此函数将在链接列表的开头添加元素。 如果链接列表为空,那么将要添加的第一个元素将是起始节点。 插入(位置):这会将节点添加到给定位置。 removeFirst:此函数将从头开始删除节点。 removeLast:此函数将在最后删除节点。 remove(position):这将从给定位置移除节点。 搜索:它将根据数据搜索节点并返回其位置。 行使: 1.试用字母链接列表😝。 2.尝试制作双向/圆形链接列表😅 希望您能对如何快速使用泛型和实现基本数据结构有所了解。 我还添加了练习,希望您能进行探索。 如果听起来不错,请在Swift check中选择Binary Search Tree Swift中的二叉搜索树 从以前的帖子开始: medium.com 快乐编码😃!

如何制作Pokemon Go for iOS —第1部分:地图和位置

在本系列文章中,我们将借助Swift 3为iOS编写一个简单的’Pokemon Go’克隆。如果您使用的是Swift的当前公共版本,则可能要考虑使用Xcode 8,它带来了Swift 2.3和Swift 3。 如果值得使用Swift 3,则可以在这里了解。 不要犹豫,使用旧版本的Swift来完成本教程,您当然可以! 如果您没有上述工具,则可以考虑从AppStore下载Xcode。 这样,您便可以开始使用Swift 2(撰写本文时)。 因此,首先让我们启动Xcode-beta(Xcode 8)并创建一个新项目。 我们要创建一个单一视图应用程序,因为我们要从一个普通的白色项目开始。 然后输入项目名称,在这种情况下将是pokemongo。 您可以随意命名,因为稍后将显示实​​际的名称。 我们要使用的语言显然是Swift ,而不是Objective-C。 对于设备,您可以选择自己喜欢的任何东西,仅iPhone或iPad,或两者都通用。 在单击下一步之前,请不要忘记选中“ 使用核心数据” ,我们需要它来将数据存储在手机上。 单击下一步后,将显示您的项目摘要。 将显示名称更改为“ Pokemon Go”,并将部署目标更改为您选择的版本,在我的情况下为10.0,因为Swift 3仅在iOS 10上运行。此外,请取消选中除Portrait之外的所有其他设备方向 。 我们几乎都准备出发。 最后一步是转到窗口左侧的文件浏览器中的 ViewController.swift ,并删除所有不必要的注释和函数,因为这将清理我们的代码(好的代码仅具有必要的功能!) 现在我们已经准备就绪,可以从实际项目开始。 转到Main.storyboard ,然后在右侧区域的最低框中选择第三个图标,然后搜索Map Kit View 。 将其拖放到您的项目中并调整其大小。 仍然在选择“地图视图”的情况下,单击画布底部灯条右侧的倒数第二个项目,可以在其中找到已拖动了地图视图的视图控制器。 确保未选择“约束到边距”并将其(如果尚未设置),所有约束都设置为0。最后,点击底部的“添加约束”,从现在开始,我们的画布将适应所有屏幕尺寸。 现在,我们想使用代码访问“地图视图”,因此需要创建一个出口。 因此,我们必须单击右上角带有两个相互干扰的圆圈的图标。 您应该会看到第二个窗口,其中包含我们的视图控制器的代码。 现在,在代码画布中的viewDidLoad-function和ViewController类之间 ,按住控件并从Map View中拖放。 要输入名称,请输入mapView (Swift主要使用驼峰式大小写,这意味着您从小字开始,每当一个单词被一个空格隔开时,您只需将“新”单词的首字母大写)。 完成所有这些之后,单击右上角的左对齐图标,然后选择ViewController.swift文件。 您应该在mapView出口旁边找到一个警告图标。 这是因为尚未导入框架 (功能等的集合)。 […]

开始进行Swift编程第16部分-inout,Lazy,Getters和Setters

之前,我们介绍了使用泛型和枚举进行闭包。 开始进行Swift编程第15部分-具有泛型和闭包的枚举 在上一篇文章中,我们讨论了错误处理。 medium.com 在本课程中,我们将逐步摆脱所有这些问题,并讨论一些可使您的代码更有效率的事情。 进出 inout是将参数传递给函数时使用的关键字。 当我们想要将变量传递给函数并修改该变量的值而不创建新变量时,使用inout 。 让我们看一下如何使用inout和不使用inout修改值。 懒 创建类时,几乎总是创建该类使用的属性。 这些属性可能只是我们打开或关闭以确定类的当前状态的标志,或者它们可能是更大的对象,例如新类用来执行某些操作的另一个类。 让我们看一个例子,我保证它是相关的。 吸气剂和二传手 获取器和设置器是计算属性的一部分。 他们是与属性观察者didSet和willSet 。 您可能还记得,当计算属性即将更改或已更改时, didSet和willSet在那里执行额外的任务。 获取器和设置器为我们提供了可用于设置值或检索值的逻辑。 这是一个例子

自动布局:朋友还是敌人?

首先是第一件事。 根据Apple的自动版面配置: 根据放置在视图上的约束,动态计算视图层次结构中所有视图的大小和位置。 例如,您可以限制按钮的位置,使其在“图像”视图中水平居中,并且按钮的顶部边缘始终保持在图像底部下方8个点。 如果图像视图的大小或位置发生更改,则按钮的位置会自动调整以匹配。 这种基于约束的设计方法使您可以构建可动态响应内部和外部更改的用户界面。 这是一个非常强大的工具,当有人完全理解它时,这几乎是魔术。 如此说来,下面列出的是我多年来发现的一些优点。 它可以帮助新开发人员 2年前,作为新开发人员,我不得不学习Swift,如何正确编写语言以及诸如扩展,闭包之类的许多其他内容。 我不想花更多的时间来编写UI,所以我了解了自动布局的工作原理。 我了解到,如果新开发人员能够很好地理解该技术,则可以节省大量开发时间。 简单的布局和适应性 当涉及到简单的布局和应用程序的适应性时,“自动布局”是一个很好的工具。 特别是对于Xcode 8,界面构建器背后的团队在改善它方面做得非常出色。 确实很棒,并且具有一些很棒的功能(接口构建器的提示和技巧将在第二部分中介绍,请继续关注) “自动布局”比编写UI更快 在iOS开发中创建用户界面的方法不是对是错。 对于许多用户而言,“自动版式”的工作原理比另一种更好且更快。 我就是其中之一。 我认为使用自动布局比通过编程设置约束要快。 先进的技术 信不信由你,Auto Layout是一项先进的技术,Apple付出了大量的努力来改进它并使其变得更好。 通过每次Xcode更新,我发现Interface Builder团队所做的更新确实执行得很好。 有用的结论 作为开发人员,在Xcode上设计UI时不要只放弃/使用一种方法。 两种方法都有其优点和缺点。 拥抱他们两个。 如果您是Auto Layout的新手,则WWDC讲座是了解其工作原理并了解一些有用的见解的良好起点。 更具体地说,当我开始尝试“自动布局”时,WWDC对我来说是如此。

鸡问题(面向协议的编程)

大家好 在本文上,我们来讨论协议扩展和面向协议的编程(POP)。 关于这个主题有很多讨论,Swift协议扩展和多重继承之间有很多比较。 因此,让我们讨论两者之间的区别以及POP听起来为什么更可靠的原因。 鸡问题 我喜欢用这个例子来说明一个小问题如何变成大规模开发和实际应用。 首先让我们看一下问题,然后再讨论。 想象一下我们需要构造鸟类的“对象/实体”的应用程序。 乍一看,我们将拥有Perrots,Sparrows和Falcons。 现在,让我们为此创建一个漂亮而智能的代码。 OOP和多重继承 所有这些鸟类共享许多东西,例如“喙”,“羽毛”,并且它们都可以“飞行”。 因此,让我们考虑以下Birds App的体系结构。 看起来很棒! 在这一点上,我们作为开发人员对我们的创作感到非常自豪。 它干净,可靠,我们只编写了一次代码,只是“ fly”方法的一种实现,这是一种非常复杂的算法。 现在,我们制作了该产品的版本1 。 此时,客户(Bird应用程序的所有者)说:“嘿,您知道吗,我注意到我的客户也希望拥有Chicken,所以请向此应用程序中添加Chickens,一旦您将它变得非常简单告诉我您有一个非常灵活的体系结构与OOP一起使用” 好的,这很容易……鸡是鸟,所以它将成为鸟的一个子类……但是等等……鸡不能飞! 因此,在这一点上,我是否需要重写此“ fly()”方法,并从“ Bird”中取消我所有漂亮的算法? 等等,这样做不仅是在重写代码,但是如果我心爱的客户决定明天他将发明一种新型的能飞的超级鸡肉,我该怎么办? 将“鸡”否定为“ fly()”的新“鸡”子类? 如果我的客户决定将应用程序移至南极并创建企鹅? 企鹅没有羽毛! OMG…我刚刚意识到我的整个体系结构对我的客户来说不够灵活! 我应该改变它吗? 我应该重写我的整个应用程序吗? 提出V2? 我应该更换我的客户吗? 我是否应该换一个鸟类完美的星球,它们都具有相同的特征? 好吧好吧让我们冷静一下 让我们尝试考虑可能的解决方案,毕竟,OOP很棒,并且确实可以反映现实世界的复杂性。 好吧,不完全是。 我们可以尝试使用OOP解决方案来奋斗。 我不会深入探讨我们可以尝试的失败解决方案: 创建两个基类:“鸟”和“飞鸟”(失败:如果客户决定购买飞机怎么办?) 使用协议/接口定义飞行方法(失败:重写很多代码) 将“ fly()”定义为接收可以飞行的对象的静态方法(失败:如果我有数百万个飞行对象怎么办?并发,多线程) 我与数百名不同的开发人员进行了此练习,让他们尝试许多解决方案。 简而言之,在OOP中解决此问题的唯一可能解决方案是使用多重继承,但是众所周知,这很危险。 只有很少的编程语言允许这种功能,并且在其自身的实现中有许多警告。 Pearl和Python使用一个有序列表进行多重继承,Java 8尝试使用编译器来避免错误,C ++实际上是真正在其完整扩展中真正实现多重继承的唯一语言之一。 因此,如果您不想仅在应用程序中创建C ++模块来解决该问题,就让我们现在尝试使用Swift功能来解决Chicken Chicken问题。 Swift […]

加快缓慢的Swift构建时间

在Xcode中查找问题区域并指定要修复的类型信息 阅读 @nickoneill的 这篇文章和更多内容, 了解在Swift的 That Thing中 发现Swift模式 今天的简短说明:人们似乎对我们现在可以轻松地使Swift 2.2编译器由于类型推断而花费12个小时以上的时间来编译一些基本代码很感兴趣。 从Matt Nedrich的这篇文章中,我们可以看到一个简单的代码示例花了太长时间而无法确定应该使用哪种类型。 现在,Swift记录了编译每个函数所花费的时间,再次使用⌘-B 生成项目,然后使用⌘-8跳转到Build Report导航器,您将在其中看到最新的构建(可能还有其他一些构建)。 接下来,右键单击您构建的目标的构建日志,然后选择Expand All Transcripts以显示详细的构建日志。 最后,您应该看到一系列绿色框,每个绿色框代表编译过程中的文件或步骤。 这些框内的文本可能需要一些时间(或单击一下)才能正确加载。 如果正确设置了构建标志以显示函数编译时间,则应该在左侧看到一行构建时间。 扫描这些行以查找任何看起来可疑的东西! 任何超过一百毫秒的时间都应进行调查。 我们可以在viewDidLoad中看到我们的630ms +的编译时间,在此之前我们已经测试了类型推断。 630ms只需几行代码! 现在我们知道类型推断可能是一个问题,我们可以调查问题区域,指定类型信息并尝试再次构建。 在这种情况下,只需将结构定义为Dictionary 即可使我们对该函数的编译时间缩短至21.6ms 。 即使再添加其余的employee对象,也不会有意义地改变编译时间。 问题解决了! 敲击代码中其余的潜在问题区域,然后尝试添加类型信息以加快项目其余部分的编译时间。 最初发布于 thatthinginswift.com 。