带示例的Swift数据结构。 第一部分:链表

前言


哪个iOS开发人员没有梦想在像Yandex或Avito这样有声望的地方工作。 不幸的是,只有hr在面试中询问梦想,但是开发人员面试官会提出性质稍有不同的问题。 引用类型和值类型或框架范围之间有什么区别? 我们每个人在面试中都多次听到的问题。 如果您的面试首先问到重要类型和参考类型之间的差异问题,或者本着“告诉我们有关SOLID”的精神,那么您显然已经在So-so-Perspectives LLC中找到工作。

在一家像样的公司中,您不会被问到这样的废话。 准备好有关调度,边表和基础队列的问题。 此类细微差别的知识在滚动,加载了单元元素时绝对不会帮助达到60 FPS,也不会使您成为俄罗斯的名誉开发者。 他们将帮助您认识到一个人,他不仅改变了xib常数4年,而且现在认为自己是一名高级iOS开发人员,但对平台真的很感兴趣。 在一个人决定达到中高级水平时,这始终是我的一个谜。 可能参加了全俄罗斯比赛,其中ROS-GOS-iOS授予了达到标准和奖项的类别和头衔。

回到面试。 享有盛誉的雇主不仅会问有关平台的棘手问题,而且肯定会问有关架构的问题。 等待问题:“为什么最后要使用VIPER而不是MVVM?”。 您可能想知道:“什么是不良MVC?”。 好吧,棺材盖上的最后一个钉子就是算法。 即使您精通iOS和移动应用程序的体系结构,但不知道数组的弱点并且无法优化元素的搜索,在面试之后,也要等待邮件中的回答:


在俄语的泛滥中,互联网上充斥着有关算法和数据结构的文章。 可能使研究难以理解的唯一缺点是Swift上缺乏示例和实现。 当您遇到许多晦涩难懂的单词甚至更多晦涩的C ++示例时,很难理解这个主题。

对于想每天在时髦的办公室和校友会议上喝果汁的每个人,谈论他独自一人如何拖累Sber的所有移动开发,我准备了几篇有关数据结构的文章。 本文面向的读者是已经熟悉泛型,使用数组/集合/字典,了解类和结构之间的差异并假装他们了解递归的开发人员。 我不会讲理论。 这已经摆在我面前,我相信它会提供很多信息。 让我们集中于示例。

链表


维基百科将对这一理论有所帮助 让我们从创建相同的节点开始。


*确保将您的Xcode配色方案更改为深色,否则您将在Mail中看不到工作

细心的读者应该问:“为什么Momkin开发人员决定将节点实现为类而不是结构? 本文是关于数据结构的!” 我建议在评论中讨论这个决定。 让我们进入链接最多的列表。 初始实现将如下所示:



每位自重的钻孔专家都会注意到, WeakReference是某种未知类型,将有理由要求实施。



添加到负责填写清单的实现方法中:




*复杂度O(1)仅在不需要复制结构时才有效。 否则,我们将具有O(n)复杂度。 这适用于所有变异方法。

添加负责从列表中删除的方法:




* @ returnableResult将使我们不必在返回值对我们不感兴趣的情况下在调用该函数之前编写“ _ =“

我们的手艺已经看起来像是工作清单。 让我们尝试使其尽可能地面向Swift。 为此,我们只需要实现两件事: BidirectionalCollection协议和写时复制技术。 让我们从协议开始。 其中的方法很少,最困难的是理解和实现Index。




太好了! 现在,我们所有的收藏集都可以在列表中找到。 我们可以对它应用map,compactMap,filter,contains等。 轮到写时复制了。 由于缺少编译器现在暗示代码不是D'Artagnan编写的代码,因此我们实现了copyIfNeeded()方法:



那些想问一个聪明的问题或指出缺陷的人正在等待评论。
PS我感谢ivlevAstef在修复错误方面的帮助。 没有薄弱的包装,没有人提出可行的实施方案。

GitHub代码

Source: https://habr.com/ru/post/zh-CN462083/


All Articles