說(shuō)明:
1)該文簡(jiǎn)短介紹在iOS開(kāi)發(fā)中遍歷字典、數(shù)組和集合的幾種常見(jiàn)方式狞山。
2)該文對(duì)應(yīng)的代碼可以在下面的地址獲得:https://github.com/HanGangAndHanMeimei/Code
一骤铃、使用for循環(huán)
要遍歷字典沛善、數(shù)組或者是集合,for循環(huán)是最簡(jiǎn)單也用的比較多的方法驶乾,示例如下:
優(yōu)點(diǎn):簡(jiǎn)單
缺點(diǎn):由于字典和集合內(nèi)部是無(wú)序的邑飒,導(dǎo)致我們?cè)诒闅v字典和集合的時(shí)候需要借助一個(gè)新的『數(shù)組』作為中介來(lái)處理,多出了一部分開(kāi)銷(xiāo)级乐。
二疙咸、使用NSEnumerator遍歷
NSEnumerator的使用和基本的for循環(huán)類(lèi)似,不過(guò)代碼量要大一些风科。示例如下:
優(yōu)點(diǎn):對(duì)于不同的數(shù)據(jù)類(lèi)型撒轮,遍歷的語(yǔ)法相似;內(nèi)部可以簡(jiǎn)單的通過(guò)reverseObjectEnumerator設(shè)置進(jìn)行反向遍歷贼穆。
缺點(diǎn):代碼量稍大题山。
三、使用for...In遍歷
在Objective-C 2.0 中增加了for ...In 形式的快速遍歷故痊。此種遍歷方式語(yǔ)法簡(jiǎn)潔顶瞳,速度飛快。示例如下:
優(yōu)點(diǎn):1)語(yǔ)法簡(jiǎn)潔愕秫;2)效率最高慨菱;
缺點(diǎn):無(wú)法獲得當(dāng)前遍歷操作所針對(duì)的下標(biāo)。
四戴甩、基于Block的遍歷方式
基于Block的方式來(lái)進(jìn)行遍歷是最新引入的方法符喝。它提供了遍歷數(shù)組|字典等類(lèi)型數(shù)據(jù)的最佳實(shí)踐。示例如下:
優(yōu)點(diǎn):1)遍歷時(shí)可以直接從block中獲得需要的所有信息甜孤,包括下標(biāo)协饲、值等。特別相對(duì)于字典而言缴川,不需要做多余的編碼即可同時(shí)獲得key和value的值囱稽。
2)能夠直接修改block中key或者obj的類(lèi)型為真實(shí)類(lèi)型,可以省去類(lèi)型轉(zhuǎn)換的工作二跋。
3)可以通過(guò)NSEnumerationConcurrent枚舉值開(kāi)啟并發(fā)迭代功能战惊。
說(shuō)明:基于Block的遍歷方式在實(shí)現(xiàn)反向遍歷的時(shí)候也非常簡(jiǎn)單,使用enumerateObjectsWithOptions方法,傳遞NSEnumerationReverse作為參數(shù)即可吞获,在處理遍歷操作的時(shí)候推薦基于Block的遍歷方式况凉。
五、使GCD中的dispatch_apply函數(shù)
使用GCD中的dispatch_apply函數(shù)也能實(shí)現(xiàn)字典各拷、數(shù)組等的遍歷刁绒,該函數(shù)比較適合處理耗時(shí)較長(zhǎng)、迭代次數(shù)較多的情況烤黍。示例如下:
優(yōu)點(diǎn):開(kāi)啟多條線程并發(fā)處理遍歷任務(wù)知市,執(zhí)行效率高。
缺點(diǎn):1)對(duì)于字典和集合的處理需借助數(shù)組速蕊;2)無(wú)法實(shí)現(xiàn)反向遍歷嫂丙。