Swift泛型應(yīng)用:模型數(shù)組去重

我們在Swift開發(fā)過程中經(jīng)常會碰到數(shù)組去重的情況结缚,基本數(shù)據(jù)類型數(shù)組的去重比較好辦,那如果碰到model模型類的數(shù)組去重走孽,又怎么進(jìn)行科學(xué)合理的處理呢尺棋?通常對model進(jìn)行去重,要依賴其某個屬性莽使,一般是一個唯一ID锐极,然后通過該ID來進(jìn)行判斷是否有重復(fù)的模型。
比如有個模型AModel如下:

class AModel {
    
    var name: String?
    var img: String?
    var aID: Int = 0 //唯一ID
 
}

普通處理

AModel的屬性中有可以用來判斷唯一性的aID芳肌,因此我們在對裝著AModel類型的數(shù)組[AModel]進(jìn)行去重時可以這么處理:

func handleFilterArray(arr:[AModel]) -> [AModel] {
        var temp = [AModel]()  //存放符合條件的model
        var idxArr = [Int]()   //存放符合條件model的aID灵再,用來判斷是否重復(fù)
        for model in arr {
            let index = model.aID   //遍歷獲得model的唯一標(biāo)識aID
            if !idxArr.contains(index){    //如果該aID已經(jīng)添加過,則不再添加
                idxArr.append(index)    
                temp.append(model)    //如果該aID沒有添加過亿笤,則添加到temp數(shù)組中
            }
        }
        return temp    //最終返回的數(shù)組中已經(jīng)篩選掉重復(fù)aID的model
    }

泛型處理

如果我們需要處理不同model類型的數(shù)組翎迁,那我們是否可以將上面的方法寫成一個通用的方法,比如下面這樣用Swift的泛型來處理:

//T為不同model的類型
func handleFilterArray(arr:[T]) -> [T] {
     //具體實現(xiàn)
}

可是我們碰到一個問題净薛,你用泛型來寫的話鸳兽,這個泛型無法確定你不同模型中需要判斷的那個ID是什么,因為BModel的唯一ID是bID罕拂,CModel的唯一ID是cID揍异,因此我們怎么才能把這個不同的標(biāo)識符給帶到這個函數(shù)中來呢,下面先來看方法一爆班,利用protocol來處理:

protocol arrayFilterable {
    var identifer:Int {get}  //該只讀屬性用來獲取不同model的不同唯一ID
}

extension AModel: arrayFilterable{
    var identifer: Int{
        return aID  //AModel則返回aID
    }
}

extension BModel: arrayFilterable{
    var identifer: Int{
        return bID  //BModel則返回bID
    }
}

然后我們的處理方法就可以寫成這樣:

func handleFilterArray<T:arrayFilterable>(arr:[T]) -> [T] {
        var temp = [T]()
        var idxArr = [Int]()
        for model in arr {
            let index = model.identifer  //通過identifer來判斷不同模型是否有重復(fù)數(shù)據(jù)
            if !idxArr.contains(index){
                idxArr.append(index)
                temp.append(model)
            }
        }
        return temp
    }

更合理的泛型處理

但以上的方法是不是還是顯得有點(diǎn)不那么高效衷掷,畢竟需要每個模型都遵循arrayFilterable協(xié)議,而且顯得可擴(kuò)展性一般柿菩,如果有一個DModel用來判斷唯一性的不是ID戚嗅,而是一個字符串呢,我們再來看看方法二枢舶,利用泛型結(jié)合Swift數(shù)組的高階函數(shù)map來處理:

//直接給Array擴(kuò)展一個方法
extension Array {

  //該函數(shù)的參數(shù)filterCall是一個帶返回值的閉包懦胞,傳入模型T,返回一個E類型
   func handleFilter<E: Equatable>(_ filterCall: (T) -> E) -> [T] {
      var temp = [T]()
      for model in self {
          //調(diào)用filterCall凉泄,獲得需要用來判斷的屬性E
          let identifer = filterCall(model)  
          //此處利用map函數(shù) 來將model類型數(shù)組轉(zhuǎn)換成E類型的數(shù)組躏尉,以此來判斷
          identifer 是否已經(jīng)存在,如不存在則將model添加進(jìn)temp
          if !temp.map( { filterCall($0) } ).contains(identifer) {
              temp.append(model)
          }
      }
      return temp
   }
}

上面?zhèn)魅腴]包filterCall的返回值E后众,就是模型的屬性中用來判斷唯一型的那個屬性胀糜,需要遵循Equatable颅拦,才能使用數(shù)組的contains函數(shù)來判斷是否已經(jīng)存在。

如果AModel用來判斷唯一性的不是aID教藻,而是name屬性距帅,則一個裝著有好多重復(fù)AModel的數(shù)組AModelArray可以這么調(diào)用這個函數(shù):

let filterArray = AModelArray.handleFilter( { $0.name } )

$0.name即filterCall閉包的返回值,用來判斷數(shù)組中model唯一性的依據(jù)括堤。

結(jié)語

通過這個小應(yīng)用碌秸,可以看出Swift中強(qiáng)大的泛型特性能夠讓我們根據(jù)不同的需求,來編寫靈活強(qiáng)大的函數(shù)和類型悄窃,讓我們避免重復(fù)冗余的代碼哮肚,更加快速高效的達(dá)到應(yīng)用目的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末广匙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恼策,更是在濱河造成了極大的恐慌鸦致,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣楷,死亡現(xiàn)場離奇詭異分唾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狮斗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門绽乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碳褒,你說我怎么就攤上這事折砸。” “怎么了沙峻?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵睦授,是天一觀的道長。 經(jīng)常有香客問我摔寨,道長去枷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任是复,我火速辦了婚禮删顶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淑廊。我一直安慰自己逗余,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布季惩。 她就那樣靜靜地躺著猎荠,像睡著了一般坚弱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上关摇,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天荒叶,我揣著相機(jī)與錄音,去河邊找鬼输虱。 笑死些楣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宪睹。 我是一名探鬼主播愁茁,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亭病!你這毒婦竟也來了鹅很?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤罪帖,失蹤者是張志新(化名)和其女友劉穎促煮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體整袁,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菠齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坐昙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绳匀。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炸客,靈堂內(nèi)的尸體忽然破棺而出疾棵,到底是詐尸還是另有隱情,我是刑警寧澤痹仙,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布陋桂,位于F島的核電站,受9級特大地震影響蝶溶,放射性物質(zhì)發(fā)生泄漏嗜历。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一抖所、第九天 我趴在偏房一處隱蔽的房頂上張望梨州。 院中可真熱鬧,春花似錦田轧、人聲如沸暴匠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每窖。三九已至帮掉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窒典,已是汗流浹背蟆炊。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瀑志,地道東北人涩搓。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像劈猪,于是被迫代替她去往敵國和親昧甘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫战得、插件充边、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴(kuò)展一個泛型類型類型約束關(guān)聯(lián)類型泛型 Where...
    寒橋閱讀 631評論 0 2
  • 我大二了,英文專業(yè)常侦。很多時候我都在想如果我當(dāng)時進(jìn)了中文系浇冰,會不會是現(xiàn)在這個尷尬的樣子,英文不想學(xué)刮吧,中文沒空學(xué)。...
    時光簡成煙閱讀 289評論 0 0
  • 今天體重沒掉器赞,有點(diǎn)小傷心……不過感覺體脂應(yīng)該是低了垢袱,腹肌快長全了…… 附贈今天早上鍛煉完后拍的局部照(燈光還是一樣...
    健康起飛吧閱讀 319評論 0 0