112648-c84074224dac5d9c.jpg
導(dǎo)語(yǔ):
在開(kāi)發(fā)過(guò)程中,也許會(huì)遇到需要對(duì)數(shù)組進(jìn)行去重的相關(guān)處理。如果數(shù)組內(nèi)只含有基礎(chǔ)類(lèi)型的數(shù)據(jù)時(shí),你可以寫(xiě)兩個(gè)for循環(huán)遍歷苏揣,用下標(biāo)取值做對(duì)比;當(dāng)然也可以用集合Set(Swift),比較方便快捷踩寇,可以參照這篇文章:Swift 中超快捷去重方法(附集合Set的一點(diǎn)干貨)牍氛。
但如果需要對(duì)model數(shù)組進(jìn)行去重,該怎么做呢增炭?請(qǐng)往下看~
來(lái)一波代碼:
//: Playground - noun: a place where people can play
import UIKit
extension Array {
// 去重
func filterDuplicates<E: Equatable>(_ filter: (Element) -> E) -> [Element] {
var result = [Element]()
for value in self {
let key = filter(value)
if !result.map({filter($0)}).contains(key) {
result.append(value)
}
}
return result
}
}
class DemoModel: CustomStringConvertible {
let name: String
init(_ name: String) {
self.name = name
}
var description: String {
return name
}
}
let arrays = ["1", "2", "2", "3", "4", "4"]
let filterArrays = arrays.filterDuplicates({$0})
print(filterArrays)
let modelArrays = [DemoModel("1"), DemoModel("1"), DemoModel("2"), DemoModel("3")]
let filterModels = modelArrays.filterDuplicates({$0.name})
print(filterModels)
相關(guān)說(shuō)明:
- 上面的代碼是一個(gè)playground忍燥,感興趣想試下其他情況的同學(xué),可以用Xcode創(chuàng)建一個(gè)playground隙姿,將以上代碼粘貼到playground即可梅垄。playground用來(lái)寫(xiě)一些測(cè)試函數(shù)還是挺有用的。
- filterDuplicates這個(gè)方法输玷,這里直接寫(xiě)在Array的擴(kuò)展里面队丝,這樣一個(gè)數(shù)組就可以隨意調(diào)用這個(gè)方法了,相當(dāng)?shù)姆奖恪?/li>
- 可能有些同學(xué)不太認(rèn)識(shí)Equatable欲鹏、Element机久,這里我就不多做說(shuō)明了,留給大家去谷歌或者查閱官方文檔的機(jī)會(huì)赔嚎,因?yàn)檫@樣成長(zhǎng)的比較快膘盖。這里分享一篇關(guān)于數(shù)組map函數(shù)的文章吧,當(dāng)然也可以查看其它更好的文章尤误。談?wù)?Swift 中的 map 和 flatMap
- 測(cè)試代碼中侠畔,第一個(gè)是數(shù)組裝的是String類(lèi)型,可以直接用其值作為判斷條件是否有重復(fù)值损晤,是否需要去重践图。第二個(gè)是我們自定義的demoModel,有個(gè)name屬性沉馆,那我們就可以用這個(gè)屬性作為是否需要去重的判斷码党,當(dāng)然肯定不能直接根據(jù)一個(gè)類(lèi)來(lái)判斷德崭。如果是開(kāi)發(fā)中,model類(lèi)肯定有很多的屬性揖盘,如果要判斷去重的話眉厨,需要一個(gè)不會(huì)有相同值的屬性,比如iD什么的兽狭,來(lái)進(jìn)行判斷憾股。
- CustomStringConvertible,可能會(huì)有同學(xué)問(wèn)這個(gè)是什么箕慧,其實(shí)是一個(gè)協(xié)議服球,實(shí)現(xiàn)這個(gè)協(xié)議,就可以用description來(lái)自定義print輸出的內(nèi)容了颠焦。