模拟 数组的三个强大功能
-
filter 过滤
let newArray = anArray.filter {$0 > 50}
过滤
anArray
里的值,生成一个满足条件的新数组模拟数组过滤代码实现
extension Array { mutating func anFilter(someFunction:(Element) -> Bool) -> Array? { if self.isEmpty{ return nil } var newArray = Array() for element in self { if someFunction(element) == true { newArray.append(element) } } return newArray } } var a = [3,4,5,6,7] let b = a.anFilter{$0 > 4} print(b) //Optional([5,6,7])
这里我是利用刚学的extension
对数组进行了扩展,然后模拟了一个过滤的代码,虽然最后生成的是个Optional,但基本已经达到目的了,好激动的说,哈哈哈~
传入一个(Element) -> Bool
型的函数,用来在我扩展的这个anFilter
函数里判断数组的每个元素是否满足我传入的这个函数的要求,满足返回真,并把满足条件的元素放入一个新的数组,最后把这个新的数组传出来。
这里用到了两个新知识点
一个是传入的函数的
(Element) -> Bool
这个Element实际上是 <u>泛类型</u> ,可以指代Int啊String啊Double啊等各种另一个是该扩展方法前的
mutating
关键字,刚好我在总结上一篇<u>Extension</u>学到了这个关键字,这个关键字是在给结构体(Structure)或枚举(Enumeration)扩展需要改变自己的实例方法的时候使用的,这隐隐的让我感觉到(貌似在哪看到过),数组(Array)本质上就是个结构体(Structure)
-
map 映射
let newArray = array.map { $0 / 2}
对
anArray
的所有元素进行更改模拟数组映射代码实现
extesion Array { mutating func aMap(someFunction:(Element) -> Element) -> Array? { if self.isEmpty { return = nil } var newArray = Array() for element in self { let newElement = someFunction(elemtn) newArray.append(newElement) } return newArray } } var a = [3,4,5,6,7] let b = a.aMap{ $0 * 2} print(b) // Optional([6,8,10,12,14])
这个原理和实现基本和上面是一致的,这个就是把数组的每个元素都拿出来,挨个做someFunction(Element) -> Element
的运算,生成一个新的元素,然后全部放在一个新的数组里,返回给我们.
-
reduce 缩减
let newArray = anArray.reduce(0, combine: +)
对
anArray
里的元素整体进行合并,缩减,第一个数(0,还可以写别的)是起始数,在起始数的基础上,在后面依次对它们进行类叠运算模拟数组缩减代码实现
extension Array { mutating func aReduce(first: Element, someFunction: (Element, Element) -> Element) -> Element { var index = 0 var current = first while index < self.count { current = someFunction(current, self[index]) index += 1 } return current } } var a = [1,2,3,4,5] let b = a.aReduce(1,someFunction: +) print(b)
哈哈,写完了
总结
这不能算是完全原创啦,因为在网上看算法相关内容的时候,有看到别人在链表里模拟过映射和过滤,灵感也是来源于此啦,本来也只是想试一试,没想到,靠着刚学到的知识,刚刚好可以写出来,非常兴奋那哈哈哈
这也算是我的一个小小的「成就动机」啦。不知不觉一动不动的2个小时了,脖子和背疼的不行不行的....
不过,站在这个人生的转折点上,又让我想到了那三个关键词:
「大量投入」「反复练习」「隐性牺牲」
加油吧~