min和max函数的实现探究

1,234 阅读3分钟

Swift也看了很久了,在掘金的第一篇文章还是献给她吧。

日前技术担当在群里抛出一张图:

技术担当的图

然后又抛出了一个问题,意思是为啥min函数的闭包里写a.0 < b.0,max函数的闭包里也要传a.0 < b.0而不是a.0 > b.0才能得到正确结果。

随即大家都给出了自己的推断,我首先想到的是看一下这个函数是如何定义的,于是乎dj_rose同学把定义发到了群里:

min函数定义
不得不说Swift的注释写的那叫一个良心,不仅有对函数每个参数的描述,还有用法示例,最后还有这个函数所用算法的时间复杂度,奈何短板太低,给的例子能看懂其他的还是看的晕晕乎乎的。

要是OC大家可能会想到去看一下编译后的C++代码是怎么实现的,Swift能不能这样搞我还不知道,但我们可以直接看源码啊,谁叫人家是开源的呢,具体的源码可以直接在Swift的官方GitHub上看到。

改完几个bug之后,我点开上面的网站找到开始找这两个函数的源码,这个地方有一个小技巧,如果你直接搜索min或者max,那可能搜索出来一堆东西都不是你想要的,这个时候你可以直接找一些比较特殊的关键字进行搜索,比如这个地方的了下面的areInIncreasingOrder,这个我觉得他就比较突出,果然大大的减少了搜索结果的数量,最后在swift/stdlib/public/core/SequenceAlgorithms.swift文件下找到了这两个函数的源码:

min和max函数
可以看到这两个函数的实现基本上是一样的,唯一的区别就在于调用areInIncreasingOrder()这个闭包的两个参数传递顺序,max函数是(result,e),min函数是(e,result),我差不多阅读源码的能力也就到此为止了,毕竟看惯了OC代码,刚开始看Swift的代码还是感觉有些陌生,我开始看的时候还认为areInIncreasingOrder()这个地方是递归调用呢,我于是得出来一个结论:“这个源码里还有递归,看起来很复杂,必须得一个一个把数组的元素带进去跑一遍才能看懂。”

之前看代码的习惯都是喜欢主观臆断、猜测,不愿意正儿八经的敲一遍看看结果,这个例子因为是大家一起讨论的可以激发人动手的欲望,因为得出来的结果可以让大家一起分享,增强了动力,我把这段源码改编成了一个可以运行的版本,加入了一些打印,去掉了一些错误处理的代码,以免造成干扰:

改版后的max函数
最后看看调用函数时闭包里传a.0 < b.0a.0 > b.0的运行结果,
打印结果

大家表示这样看的就很明白了,至于max和min函数的实现原理我在这也就不分析了,有源码在这我相信大佬们都能看懂,分析这两个函数也不是我这篇文章最主要的目的,作为第一篇文章,我想记录一些遇到问题时的思考方式和解决办法。

之前的学习经历让我感觉很多东西学的都是一知半解,当时看的很懂但过一阵子就忘了,遇到问题第一时间先上网查,然后看到各种答案,也不知道哪个是对的,可能当时的问题解决了,但背后都的原因还不是很清楚,这些归根结底还是没有自己亲自动手去实践一遍,学习Swift是一个很好的培养学习能力的机会,你看她的文档写的是辣么的清晰,还是开源,当你第一次看到一个美女洗完澡一丝不挂的躺在你面前的时候,不要觉得害羞,要敢于看她,多看看你就不愿看其他辣些穿衣服的女人了。