这里每天共享一个 iOS 的新知识,快来重视我吧

前语

数组中删去重复项是一项常见的任务,在 Swift 中,规范库没有直接提供一个体系函数给咱们,有必要自己完成这样的办法。

完成数组去重的办法有许多,今日来介绍一些常用的办法。

1、运用 Set 去重

Set 也是一个调集,仅仅它不包括重复项,运用这个特色,咱们能够简单的给一个数组去重:

letarray:[Int]=[1,1,3,3,2,2]
letset:Set<Int>=Set(array)
print(set)

上边的代码会打印去重之后的 [1, 2, 3],但成果也可能是 [3, 1, 2],也可能是 [3, 2, 1],这就涉及到 Set 的原始设计了,它内部的元素是无序的,不能确保固定的次序,假如你对次序有要求,就不能用 Set 来完成了。

2、巧用字典去重

咱们都知道字典中是无法存储相同 Key 的,也就能够运用 Key 的唯一性往来不断重:

letarray:[Int]=[1,1,3,3,2,2]
vardic:[Int:Int]=[:]
array.forEach{dic[$0]=0}
print(dic.keys)

先把 array 遍历一遍,所有元素作为字典的 key 存储起来,最后再取 dic.keys 获得去重之后的数组。

但是字典的 key 也相同是无序的,并且运用字典会带来额定的功能开支,因此不推荐这种方式。

上边提到这两种计划都无法确保次序,假如需求确保去重后的次序和原数组保持一致,请看下边的几个计划。

3、运用 NSOrderedSet

NSOrderedSet 是 OC 年代的产物,承继自 NSObject,它能够像Set 相同完成去重,也能够确保次序:

letarray:[Int]=[1,1,3,3,2,2]
letorderSet=NSOrderedSet(array:array)
print(orderSet.array)

最终打印 [1, 2, 3],次序和原数组保持一致,但是需求留意这玩意功能比 Set 差许多。

4、遍历数组去重

这也是最符合直觉的办法,把数组遍历一遍,创立个新数组,假如这个元素没有参加新数组就加进去,假如加过了就抛掉:

letarray:[Int]=[1,1,3,3,2,2]
varnewArray:[Int]=[]
array.forEach{itemin
if!newArray.contains(item){
newArray.append(item)
}
}
print(newArray)

最终打印 [1, 3, 2],也是保持次序的。

为了更方便调用还能够将这个办法写个数组扩展:

extensionArraywhereElement:Hashable{
varunique:Self{
varnewArray:Self=[]
forEach{elein
if!newArray.contains(ele){
newArray.append(ele)
}
}
returnnewArray
}
}

这样调用的时分就方便了:

letarray:[Int]=[1,1,3,3,2,2]
print(array.unique)//[1,3,2]

5、filter 高阶函数 + Set

Set 在刺进元素的时分调用 insert 函数,这个函数回来一个元组,第一个值是一个 Bool 类型代表是否刺进成功,假如现已包括了这个元素则不能刺进成功,另一个是被刺进的这个元素,这在 Set 的函数声明中能够看得出来:

funcinsert(_newMember:Element)->(inserted:Bool,memberAfterInsert:Element)

咱们能够运用这个特性,再加上 filter 这个高阶函数,来给调集 Array 写一个扩展:

extensionArraywhereElement:Hashable{
varunique:Self{
varseen:Set<Element>=[]
returnfilter{seen.insert($0).inserted}
}
}

调用办法和上边的方式相同。

点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识

本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这里仅仅同步,想要及时学到就来重视我吧!