遇到的問題
需求是我需要在一個數(shù)組cellModelArray中添加許多對象(這些對象都是自定義模型類的model),獲取的數(shù)據(jù)源中可能包含N個相同的模型良狈,現(xiàn)在往cellModelArray這個數(shù)組中添加對象之前要檢驗一下該數(shù)組中是否已經包含一個相同的對象稼跳,如果不存在煮寡,才添加楞黄。
分析
如果一個數(shù)組里面包含的對象都是諸如NSString涝影,NSNumber這樣的元素,直接用cocoa提供的API就能直接判斷數(shù)組是否包含給定的元素魄眉,但是對于自己定義的數(shù)據(jù)模型砰盐,就不是俺么簡單了。我的解決辦法是遍歷原數(shù)組坑律,根據(jù)數(shù)據(jù)模型里能唯一標識該對象的某一個屬性判斷是否已存在相同的元素,需要聲明一個BOOL值記錄判斷結果岩梳。
主要代碼如下:
__block BOOL isExist = NO;
[self.cellModelArray enumerateObjectsUsingBlock:^(WorkerEvaluateModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj.workerName isEqualToString:cellModel.workerName]) {//數(shù)組中已經存在該對象
*stop = YES;
isExist = YES;
}
}];
if (!isExist) {//如果不存在就添加進去
[self.cellModelArray addObject:cellModel];
}```
###引申
其實這里可以引出一個關于怎么判斷相等的問題,深入研究起來還是挺復雜的晃择,這里貼一篇干貨文章:[Thompson的文章](http://nshipster.com/equality/)
總之冀值,就是在比較兩個對象是否相等或者是判斷一個對象是否在一個collection里面的時候,就要特別注意:
>- 對于普通的NSObject比較用isEqual:方法比較hash宫屠,上面那個文章的Thompson大叔說比較的是內存地址(我覺得挺有道理的不然普通的兩個對象還在哪里有可比性==)
>- 對于Foundation里面的NSObject的子類如NSString列疗、NSData、NSDate等(詳細地還是看文章哈浪蹂,反正沒有NSArray╮(╯▽╰)╭)抵栈,有定義相應的判斷方法,所以用的話盡量采用子類中的比較方法
>- 對于自己定義的類的話坤次,如果要用到比較古劲,就要重新實現(xiàn)isEqual:和hash方法,實現(xiàn)的方法還有栗子什么Thompson大叔也說了缰猴,嗯不然會很容易悲劇的╮(╯_╰)╭
######備注:使用快速枚舉for-in或者enumerate枚舉器對數(shù)組進行遍歷時不能修改數(shù)組(包括增加产艾,刪除和給對象賦值等操作),如果執(zhí)意如此滑绒,便會報錯胰舆,拋異常如下:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7c873ea0> was mutated while being enumerated.