Tag: 编程

Swift中的树数据结构

如果您不熟悉数据结构和算法,那么树数据结构就是一个很好的起点。 实际上,如果您曾经使用过JSON,那么您已经很熟悉这个概念。 树是一种数据结构,可用于对对象之间的层次关系进行建模。 该树由节点组成,每个节点具有以下组成: 一个值。 可选的父节点。 子节点列表。 术语 虽然树中的所有对象都被视为节点,但它们根据周围的上下文具有不同的命名约定。 根节点 :这是树的最高层的节点,并且是唯一没有任何父节点的节点。 叶子节点 :这是一个不包含任何子节点的节点。 Swift中的节点数据结构 这里要注意的一些事情是: 1. Node类对它拥有的值是通用的。 但这不是必需的,但是,它允许您以与数组相同的方式构建包含不同数据类型的各种树,从而有助于代码重用。 2.我们已将持有父节点的属性标记为弱。 由于父节点拥有对其所有子代的引用,而子代拥有对其父代的引用,因此我们将父代参考标记为弱,以防止创建强参考循环。 3.我们已将父级和子级属性标记为只读。 这是因为直接修改这些值可能容易出错。 最好通过Node类上的方法公开一个安全的API。 您可以看到,通过在Node上使用addChild方法,我们将永远不会忘记在新添加的节点上设置父级。 树木和递归就像面包和黄油。 您可以尝试: 1.创建一个在包含给定值的树中查找第一个节点的方法。 2.打印出节点及其所有子节点的文本表示形式。 在Swift算法俱乐部中更深入地了解这棵树的例子。

蒸气与Kitura基准测试

IBM-Swift团队的Chris Bailey最近在Swift London上发表的讲话显示了服务器端Swift的有趣基准图。 我对这些结果感到非常惊讶,因此我针对最新的Vapor(0.15),最近一次针对性能的版本(0.11)和针对Kitura(0.24)的Vapor’s Engine(在Vapor 0.15中使用0.4)运行了一些本地基准测试。 结果表明,Vapor的最新性能版本击败Kitura,而最新版本则落后5%。 在IBM-Swift的图表中看不到40%的领先优势。 此外,可以说与Kitura更具可比性的Vapor Engine具有领先优势。 IBM的测试可能正在发现Vapor的弱点,但由于IBM的结果中未包含确切的环境和基准,因此我们很难知道。 如果有人了解环境和过程的详细信息,请发表评论,以便我们改进调优! 结果 与往常一样,这是本文中运行的基准测试的深入细节和结果。 机 蒸气(0.11) Gertrude:〜tanner $ wrk -d 10 -t 4 -c 8 http:// localhost:8080 / plaintext 运行10s测试@ http:// localhost:8080 / plaintext 4个线程和8个连接 线程统计平均值Stdev Max +/- Stdev 延迟438.06us 97.97us 5.03ms 84.30% 要求/秒4.53k 140.02 5.04k 70.79% 182307个请求的读取时间为10.10秒,已读取25.91MB 请求/秒:18050.53 传输/秒:2.56MB 蒸气(0.15) Gertrude:〜tanner $ wrk -d […]

解决LeetCode中的问题对我有什么帮助?

几周前,我启动了我的第一个iOS应用程序,它具有关于Swift的非常基础的知识,这些知识是我通过一些教程和主要是Apple文档中学到的。 但是后来,我对任何编程语言都不了解,几乎所有在Swift中学到的东西对我来说都是新的。 掌握了基本数据类型,条件语句和循环的新手知识之后 ,我开始使用Swift进行编码。 在开发应用程序的过程中,我学习并使用了某些iOS SDK和库。 随着我的知识的增长,它主要取决于应用程序开发本身,而很少涉及编程概念。 这里要具体说明数据结构和算法。 我在应用商店中发布了我的应用。 在与朋友一起审查该应用程序并谈论其可扩展性时,我了解到我还有很多东西要学习。 不仅是编程语言,数据结构和算法,还涉及解决问题的方法。 我相信通过经验学习,这样我才能更快地学习,解决现实生活中的问题并保持动力。 因此,我一直在浏览有关我应该学习什么以及应该如何开始的网站,并且对初学者学习编程的所有不同选择感到非常困惑。 幸运的是,我的一个朋友向我介绍了Leetcode。 LeetCode是一个平台,允许任何人以越来越困难的方式解决编程问题。 当我开始解决问题时,我觉得LeetCode是一个很好的平台,可以提高您在解决问题和编码方面的技能 。 它支持Swift,因此我也可以掌握编程语言,最终帮助我更快更好地构建iOS应用。 LeetCode 提升您的编码技能,并迅速找到工作。 这是扩展您的知识并做好准备的最佳场所。 leetcode.com 如何开始解决问题的实践: 首先,对要学习的东西有个目标 。 对我而言,这是使用正确的OOPS概念编写更好,更简洁的代码,并对数据结构和算法有深入的了解。 从简单的事情开始,这样您就会获得信心。 然后逐步解决中/硬问题。 尝试在40分钟内解决 。 如果找不到解决方案,请查看提示,然后继续。 当您开始感到更加自信时,请减少时间。 如果您不了解某些内容,请不要犹豫 。 当我说Google时,请不要用Google搜索问题本身。 Google会根据您的想法解决问题,并了解如何实施这些想法。 对于数据结构(DS)学习 ,首先列出要保留的数据结构 。 然后阅读有关google,GeeksforGeeks等中的内容的信息,一旦您掌握了一些知识,请先使用您选择的编程语言来实施DS ,然后再使用DS解决问题。 然后在LeetCode中搜索数据结构的实现问题。 解决该问题的方法有助于我理解如何将特定类型的数据结构应用于问题。 测试您的代码并提交 。 如果您的代码没有通过,请不要放弃。 尝试修复错误,直到正确为止。 LeetCode的主要学习成果: 了解面向对象的编程。 更好地解决问题 。 开始掌握时间和空间的复杂性 。 了解哈希表和B树 。 […]

TableViewCell管理のグッドプラクティス

Table,TableViewのCellはどのように管理していますか? 愚直に実装して,后から追加の要件が降って来たときに,DataSourceが目も当てられない状态になっていませんか? ではの记事では,TableViewのCellを良い感じに取り回すためのグッドプラクティスについてサンプルを交えて绍介したいと思います。 叩きとなるサンプルとして,TODOアプリを作成することを考えましょう。 要件 一番上にプロフィールのセクションを表示 カテゴリごとのTODOタスクを并べる 各カテゴリにはヘッダーを设ける この要件のTODOアプリを, 単纯に実装 中间表现を作成 抽象化 という3Stepで见ていきたいと思います。 単纯に実装していくと,以下のようになるかと思います。 表示するタスクの配列をプロパティとして持つDataSourceを作る 科の数 部ごとの行の数 科のヘッダータイトル 各行に表示する单元格 こんなにシンプルな要件なのにもう70行ですね… 辛いこと DataSourceのそれぞれのメソッドで开关文(或其他文)が乱立してしまい,DRYじゃない 查看のレイアウトが変わった际の影响范囲が大きい そこで,表示されるデータと表示するTableViewの间の中间表现として, 各节,行でTableViewに何を表示するかを表现する 二重配列 (外侧がsection,构成がrowを表す入れ子配列)を定义することで,上记の辛いことを解消していきたいと思います。 表示するタスクを二重配列として持つDataSourceを作る これにより, numberOfSections numberOfRowsInSection titleForHeaderInSection cellForRowAt で毎回indexPathによる分岐を作る必要がなくなりました。 科の数 部ごとの行の数 科のヘッダータイトル 各行に表示するCell 分岐の处理が共通化されて70行→ 55行とだいぶスッキリしましたね。 TableViewの状态を表す中间表现を二重配列として切り出すことができました。 Data,他の全てのDataSourceにおいて同じような处理を何度も书いていくのも面倒なので,これらを抽象化した衬底クラスStructuredTableCellDataSourceを作ります。 Table,TableViewの剖面,行を表す构造体を定义します。 TableCellSection.swift TableCellRow.swift そして,二重配列として表现していたTableViewの状态を, TableCellSectionの配列として持つStructuredTableCellDataSource を定义します。 表示するタスクをTableCellSectionの配列として持つStructuredTableCellDataSourceを作る UITableViewDataSourceの处理を共通化していきます。 (このあたりは先ほどとやっていることはほとんど同じですね) 科の数 部ごとの行の数 科のヘッダータイトル Cell,Cellの构成处理はまるっと抽象化できないので,次のように少し工夫してあげる必要があります。 […]

Curiosity.letsGetSwift.sorted()

问:如何在Swift中实现排序。 它使用哪种算法? Google —如何在Swift中实现排序 单击解释它的stackOverflow链接。 单击答案中的源代码链接以转到实现排序的确切文件。 想知道.gyb是什么东西? 以及文件中的所有%是什么? Google什么是gyb 找到这个很棒的帖子 了解什么是gyb以及如何使用它。 cd您最喜欢的代码实验目录 mkdir和swift-stdlib一起玩&& cd和swift-stdlib一起玩 curl -O https://raw.githubusercontent.com/apple/swift/master/utils/gyb.py 触摸swift.sort.gyb 打开-a Sublime \文本swift.sort.gyb 复制第3点中文件的粘贴内容 python ./gyb.py — line-directive = -o sort.swift sort.swift.gyb 打开sort.swift 花费剩下的时间理解700余行代码 有一些☕️

斯威夫特预期为零,不是

我的单元测试失败。 它想要nil但得到了 。 我最初的反应是指责我的计算机愚蠢。 您是否期望我提供其他类型的nil ? 只有一个nil ,名字叫nil 。 但是请稍等。 电脑还不足以欺骗我们。 我做错了什么? 字典问题 这一切都很好,而且是预期的。 我遇到了问题,因为我将值类型设置为“ Any? 而不是Any 。 Swift让我的价值翻倍! 将键设置为nil 在“字典”中将键设置为nil ,它将为您删除该键/值对。 这就是上面第8行的行为符合预期的原因。 如果要在具有可选值类型的Dictionary中将值显式设置为nil ,则必须先将其包装。 当我第一次使用var dict: [String: Any?] = [“first”, nil]创建字典时,Swift会自动执行此额外步骤var dict: [String: Any?] = [“first”, nil] —它在后台为我包装了nil。 不要这样! 最后,我重构了Dictionary,使其值不使用可选参数。 必须记住的规则越少越好。 如果我对自己的代码感到困惑,那么另一个开发人员加入该怎么办? 如果您想进一步思考这个想法,请查看Tyler Johnson关于代码设计的文章。 代码应该像政治卡通一样呈现自己-充满了直率的隐喻,带有有用的标签,没有任何微妙之处。 肖恩判断 Livefront的 代码是什么样的 。

学习Swift和iOS开发第4部分:函数

函数是编程中的核心组件。 它们是构建功能应​​用程序的基础。 函数有助于使我们的代码更易读,更分隔并最终更高效。 我们可以编写一个函数来执行特定任务,然后在整个应用程序中随意重用它。 每天,大多数人都按照一套常规生活。 他们经常做的事情甚至没有考虑或意识到自己正在做。 想一想第一次醒来时的工作。 我自己知道,我滑下床,跌跌撞撞地走过房间,走到我嘈杂的电话旁,使闹钟静音。 仅此事件便包含了我每天以相同顺序执行的几个不同步骤(除非我忘记设置闹钟)。 1.唤醒警报声 2.滑下床,尽量不要意外唤醒我的妻子。 3.错开警报。 4.使我的闹钟静音。 上面的步骤是一个功能。 我一遍又一遍地(每天早晨)完成的一组步骤。 在伪代码中,这可能类似于: var awake = false var inBed = true var walk = false var alarmSilenced =否 func getUp(){ 醒着=真 inBed =假 行走=真 AlarmSilenced =真 } 函数以自上而下的方式在内部运行代码。 换句话说, awake设置为true , inBed设置为false , walking设置为true , alarmSilenced设置为true 。 但是,我的唤醒隐喻并不完美,因为我大概需要10到15秒钟才能完全醒来,走过去并使警报静音。 现代设备可以如此快速地处理函数内部的代码,即使它逐行地运行在每一行代码中,它几乎就像是立即在运行。 简单地说,函数是一种使用给定的集合或参数执行特定动作的方法。 您将在本系列稍后将完成的许多高级项目中使用它们。 但是关于功能的讨论已经足够了……让我们来写一些吧! […]

如何在macOS上编写没有界面构建器的NSViewController。

在上一篇文章中,我写过关于在Cocoa中为常规NSView设置背景色的信息。 因此,要想打个比方 ,我想分享如何制作NSViewController而不使用笔尖/ xib或情节提要。 这似乎是一件微不足道的任务,确实如此。 但是,在没有先验知识的情况下,您可能会很快发现一个基本的陷阱。 让我们在旅途中展示这个节目,看看一些代码。 就像上一篇文章一样,我将分享如何在iOS中完成此操作。 在这里,我们有一个名为MyViewController的NSViewController子类。 空视图控制器在这里没有什么特别有趣的。 非常简单! 让我们为macOS尝试相同的示例,看看会发生什么。 看起来一样,应该表现得一样吗? 好吧,也许有人会假定,但是,这会给您以下日志消息: -[NSNib _initWithNibNamed:bundle:options:]无法加载捆绑中的nibName:Apex.ViewController(空)。 就像消息中所述,您的视图控制器无法加载,导致其无法显示。 其原因是寻找显然不存在的nib文件。 由于接口构建器已深度集成到Cocoa的体系结构中,因此笔尖是macOS中的默认设置。 这意味着您必须做一些额外的工作才能使其正常工作。 幸运的是,它涉及的更改很少。 这里缺少的是视图控制器视图,要修复它,我们需要实现loadView方法。 因此,让我们看另一个示例,其中我们有一个不使用接口生成器的有效NSViewController实现。 就是这样,您现在可以在不使用NIB的情况下创建视图控制器。 编码愉快!

Swift还是Objective-C? 适用于iOS开发人员的工具提示。

在创作过程中,总会有一些选择和矛盾之处。 在UX设计师就Photoshop vs Sketch主题进行辩论并就有效的原型工具发表意见时,iOS开发人员也有自己的争论。 今天,我们将介入并在一些关于哪种编程语言是Objective-C或Swift的全球讨论中添加一些想法。 我们要求Tubik CTO和经验丰富的iOS开发人员Maria Nazarenko与Tubik Blog读者分享她的观点。 简要背景 让我们从一点点历史开始。 在讨论的一对编程语言中,第一个也是最老的是Objective-C。 它最初是由Brad Cox于1980年代初发明的。 因此,可以肯定地应用于这种编程语言的要点之一是,它确实经过了几代开发人员的反复试验和测试。 目前,Objective-C通常被描述为通用的,面向对象的编程语言,它将Smalltalk样式的消息传递添加到C编程语言中。 在Swift出现之前,Objective-C一直是开发人员用于OS X和iOS操作系统及其API的主要编程语言。 在2014年苹果WWDC上推出的Swift带来了自己的革命。 概括而言,Swift是一种通用的多范式编译程序语言,它是为iOS,OS X,watchOS,tvOS和Linux开发的,拓宽了以前的操作系统范围。 Swift旨在与Apple的Cocoa和Cocoa Touch框架以及已经为Apple产品编写的大量Objective-C代码一起使用。 最初,Swift的目标是比Objective-C更具弹性和安全性,并且更加简洁和友好。 它是使用LLVM编译器框架(包括Xcode 6)以及使用Objective-C运行时库构建的,该库使C,Objective-C,C ++和Swift代码可以在一个程序中运行。 因此,它为开发人员扩大了专业视野,使他们的工作更有效率。 这是开发人员开始讨论更好,传统或创新的里程碑。 哪个更好:Objective-C还是Swift? 前段时间,我们在关于Photoshop和Sketch之间选择的热烈的全球讨论中表达了我们的看法:“ 我们要给出的答案确实很简单。 可以互相补充的选项之间不应有任何战争。 显然,现在没有任何完美而理想的设计软件:如果存在,那么每个人都只会使用这一理想选择,而无需战斗。 » 似乎在iOS开发中,今天的情况确实相似。 即使阅读完Swift与Object-C的所有扩展功能之后,选择似乎也不是那么明显。 实际上,在Swift尚不成熟的时候,Objective-C便经过了多年的检查和测试。 在Objective-C中已经开发了大量产品,因此过渡到其他视图肯定需要花费一些时间和精力。 根据她在iOS开发中的丰富实践经验简要地描述了编程语言,Tubik CTO Maria提到,尽管Objective-C年龄较大且很常见,但是Swift可以被描述为语法更简单,工作过程更稳定。 哪种编程语言更有用? 由于Xcode是带有一组软件开发工具的集成开发环境(IDE),iOS开发人员实际上可以使用同一开发人员工具来应用Objective-C或Swift。 只要Objective-C存在更长的时间,使用这种语言自然就可以完成许多简单和复杂的应用程序。 不了解Objective-C并直接从Swift开始会限制开发人员的专业灵活性。 在开发人员必须更新现有产品的情况下,这一点尤其明显。 有时会发生这样的情况,开发人员只知道Swift,建议将现有的(也许是大的甚至是巨大的)代码从Objective-C重写为Swift,客户在逻辑上不认为这是可以接受的,当然也不接受为此付出代价的必要工作。 考虑到这一点,最好的选择是同时了解两种语言。 这为开发人员提供了自然的专业灵活性,使其可以处理当前项目中必须处理的任何任务和环境。 有两种策略主要取决于可用时间。 如果在学习基础知识和将其应用到实际实践之间花费了大量的时间,我们的建议是从Objective-C开始。 尽管它通常被描述为更复杂,但是它为创建和使用iOS系统的应用程序的基本原理和例程奠定了坚实的基础。 在此基础上,学习语法上更简单的另一种iOS语言(例如Swift)似乎并不难。 但是,还有另一种策略,它比以前的策略更具动态性,适用于那些没有足够时间处理需要尽快开始实际工作的人。 […]

“经理”对象的麻烦

第一次查看旧项目时,我会扫描警告标志。 我讨论了单例,过多的观察者,今天我将讨论“经理”类。 我必须重申这些是准则,而不是规则,在准则中,这不是关键。 到那里的时候,这里的经理应该对审计进行审核。 但是,如果您有诸如LoginManager,CacheManager和DataManager之类的许多类,则可能会遇到体系结构问题。 症状 管理者可能是职责不明确的症状。 当您考虑时,“经理”一词毫无意义。 在面向对象的编程中,每个类都是一个管理器。 可可触控可能具有UIApplicationManager,UIViewManager甚至是不起眼的NSStringManager。 与现实世界一样,最糟糕的经理人也始于善意。 假设您的AvatarUploadController长超过3,000行,并且其中大多数内容都在处理,例如验证图像尺寸,调整图像大小,上载,检查网络错误等等。 如果您将代码剪切并粘贴到另一个类中,并将其命名为AvatarManager,则它会继续进行。 现在退后一步,问为什么“大规模视图控制器”是个问题。 这是单一责任原则。 每个类都应负责单个功能。 小型视图控制器很好,但是我可以使用大型视图控制器,只要它只能处理视图控制器的内容,例如设置视图层次结构和响应适应性变化。 当您的控制器处理网络时,您就麻烦了。 将大量业务逻辑提取到AvatarManager中可以解决当前的问题。 如果我们要说的是五十行代码,也许就足够了。 但是,如果您要处理成千上万的业务逻辑,则将其包装在Manager中是半措施。 您将扫帚扫入厨房,清理了客厅中的扫帚。 另一方面,管理者可能是人造面向对象设计的征兆。 考虑一下NSFileManager,它实际上只是文件功能的集合。 在真正的OO设计中,可以调用URL实例化NSFile()对象,然后调用其remove()方法,而不是调用removeItemAtURL()。 这并不是说所有代码都必须是面向对象的,而是NSFileManager通过伪造它来破坏功能。 它使用的是singleton defaultManager,因此存在有人(可能是随机的第三方库)分配给其委托属性的风险,并且搞乱了整个应用程序的文件操作。 这真的比一组松散的文件功能要好吗? 如何修复 我已经可以看到初级工程师单击“重构”按钮,准备将Manager与Broker,Coordinator,Utility等进行交换。 这就是规则的问题:詹克找到了方法。 在审核Manager类时,请问:“该类负责什么?”如果您在回答问题时遇到问题,请问:“我可以将其分解吗?”在化身上载示例中,我将提取NetworkAPI ImageValidator ,ImageConverter等。 经理并不是一个大的危险信号,因为即使您知道自己在做什么,它也是一个容易退缩的名词。 如果高级工程师坐在屏幕上想一个名字的时间太长,他们的“你太聪明”的感觉就会浮现。你不想成为那种在不提供任何东西的情况下继续关注美学的业余爱好者。 甚至Apple框架也使用名词,例如Core Location的CLLocationManager。 嘿…让我们来上课吧! 它的职责是什么? 它跟踪用户位置的更改。 它承担太多责任吗? 我不这么认为。 我会担心它是否包含不相关的内容,例如反向地理编码。 好吧,我们可以重命名该类以澄清问题并消除责任感吗? 我将使用CLLocationObserver或CLLocationTracker。 真好! 除了苹果会在游戏后期重命名CLLocationManager之外。 太多的旧代码依赖于此,即使您构建了代码迁移器来提供帮助,也很难证明在向用户交付功能时浪费时间在此上是合理的。 但是,如果您要构建持久的东西或建立任何类型的依赖关系,则值得花额外的几分钟时间在第一时间对事物进行命名。