遍历这个问题,相信每个开发者都是会遇到的问题,OC数组字典遍历用啥,for循环?是不是有点low?其实OC给出了遍历的方法,下面来说一下。
##1、首先说一下数组Array的遍历
在NSArray的头文件中,看到了这么几个方法:
- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
其实看方法名也能知道大概了,就说一下使用方法吧。
一般我就是用第一个遍历方法,通过array对象调用,block返回。block提供了三个属性:obj、idx、stop。
使用:
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"这是第%lu个元素,元素内容为%@",idx,obj);
}];
是不是很简单。
##2、在来说说字典的遍历
其实字典的遍历跟数组的遍历很像,字典就是会有key和value
示例:
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"key = %@;value = %@",key,obj);
}];
是不是也非常简单
##3、 好了,我们猜测一下实现
毕竟不是开源的,我也就是猜测一下,是用什么方式实现的遍历就不知道了,我就假设用循环····
- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block {
BOOL stop = NO;
for (int i = 0; i<self.count; i++) {
block(self[i],i,&stop);
if (stop) {
return;
}
}
}
4、最后再说说注意事项优缺点
优点显而易见:
1、方便
2、代码量减少
3、还可以装一下13
缺点也很明确:
1、block操作,需要注意持有对象、内存。。。
2、不能进行插入删除操作,否则index变化则会有问题
说完优缺点,注意事项自然就出来了,总之按实际需求来吧