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

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

作者: 8fe8946fa366 | 来源:发表于2018-03-31 21:53 被阅读9次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ebdncftx.html