编写高质量iOS与OS X代码的52个有效方法--第48条

2018-03-31  本文已影响9人  8fe8946fa366

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选择所有类型。

上一篇下一篇

猜你喜欢

热点阅读