48条:少用for循环,多用块枚举
1.普通的for循环遍历
⚠️:NSDictionary和NSSet都是无序的,因此无法通过访问index(下标)的形式来直接访问其中的值!😫刚刚这道题答错了。。。
要想获取value就得先找到对应的key,用key去访问value。
⚠️:一个key要对应一个value啊,不能同一个key对应好多个value那就不是key了呀。
for循环遍历的方法如下:
NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"xiaohong",@"xiaoming",@"xiaoliang",@"xiaolu", nil];
NSArray* tobeDeletedArray = [NSArray arrayWithObject:@"xiaoming"];
[dict removeObjectsForKeys:tobeDeletedArray];
NSArray* keyArray = [dict allKeys];
for (int i = 0; i<keyArray.count; i++) {
id key = keyArray[i];
NSString* value = dict[key];
NSLog(@"%@",value);
}
2.使用OC1.0的NSEnumerator遍历
NSEnumerator是一个抽象基类,定义了两个方法:
-(NSArray*)allObjects
-(id)nextObject
这个类的关键方法就是nextObject,返回枚举里的下一个对象,每次调用这个方法之后被遍历的collection就会自动更新,如果nextObject返回nil就代表遍历结束了。
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:@1,@"age1",@2,@"age2",@3,@"age3", nil];
NSEnumerator* enumerator = [dict keyEnumerator];
id key;
while ((key = [enumerator nextObject])!=nil) {
id value = dict[key];
NSLog(@"%@",value);//这里非常好的体现了字典是无序的,打印出的结果是无序的
}
3.快速遍历(for in)
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:@1,@"age1",@2,@"age2",@3,@"age3", nil];
for (id key in dict) {
id value = dict[key];
NSLog(@"%@",value);
}
⚠️:与普通的for循环不同,这种方法不能快速获取到遍历对象的下标。
4.用block遍历
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:@1,@"age1",@2,@"age2",@3,@"age3", nil];
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
id value = dict[key];
NSLog(@"%@",value);
}];
此方法的优势在于:
可以从block里获得更详细的信息。
可以直接修改block的方法签名,免于进行类型转换。指定类型的具体类型还有一个好处就是,编译器可以检测出开发者是否调用了该对象所不具备的方法,发现问题之后会及时报错。
此方法可以选择遍历的策略:
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationOptions usingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { }];
NSEnumerationOptions是一个enum,里面的各种取值可以用按位或连接,也可以用kNilOptions选择所有类型。