zoukankan      html  css  js  c++  java
  • OC基础第五讲--Block、数组高级、字面量

    Block

    1.1block与函数指针

    函数:

    int sum(int x, int y)

    {

      retrun x + y;

    }

    函数指针:

    把上面函数原型int sum(int x, int y)中的函数名替换成(*p),即可得到一个函数指针int (*p)(int x, int y)。

    这个函数表示指针p指向一个函数,这个函数有两个int型参数,返回值是int类型。

    Block:把函数指针int (*p)(int x, int y)中的'*'换成'^'就是我们block的声明,即int (^p)(int x, int y)

    (int x, int y)还是表示参数,返回值还是int型。

    1.2block定义与语法

      定义:有名称的函数可以直接通过函数名来调用,或者通过函数指针来调用,那没有名称的函数只能通过block来调用,block是匿名函数(没有名称的函数),block变量存放着函数的实现,通过block变量能直接调用函数。

    语法:声明并实现一个block

    int (^myBlock)(int, int) = ^ (int a, int b){

                return a + b;

            };

    上面这个block的功能是返回两个整数的和,需要注意的是,具体实现用"{}"括起来,并且外面有';'。等号右边的参数列表不能省略参数名,左边的可以省略。 

    1.3block的使用

    1.3.1 重定义

    我们知道,函数指针可以重定义,同样的,我们也可以对block进行重定义

    对int (int, int)进行重定义typedef int (^BlockType) (int, int),那么现在BlockType类型就等同于int(int, int)

    上面的block就可以简化为:

    BlockType myBlock = ^ (int a, int b){

                return a + b;

            };

    1.3.2block与局部变量

    block内部,全局变量可以访问与修改;

    但是局部变量只能访问,不能修改,如果非要修改,可以在定义局部变量的时候在数据类型前加__block

            __block int count = 5;

            int (^block4)(int) = ^ (int x){

                count ++;

                return x * count;

            };

            NSLog(@"%d", block4(10));

    Block 与 数组排序

    2.1字符串排序

    NSArray *array = [NSArray arrayWithObjects:@"abc1", @"abc5", @"abc2", @"abc9", nil];

            NSComparator sortBlock = ^(id obj1, id obj2){

                return [obj1 compare:obj2];

            };

            array = [array sortedArrayUsingComparator:sortBlock];

            NSLog(@"排序后:%@", array);

    2.2数值排序

    因为普通的数据类型不能存在数组中,数组中只能存放对象,所以要对数组中的字符串进行数值排序,就必须先把字符串转成数值类型

     NSArray *array2 = [NSArray arrayWithObjects:@"12", @"23", @"1", nil];

        array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

    NSInteger obj1Int = [obj1 integerValue];       //  把字符串转成数值

    NSInteger obj2Int = [obj2 integerValue];

    if (obj1Int > obj2Int) {

                return NSOrderedDescending;      //  NSOrderedDescending,NSOrderedAscending,NSOrderedSame是

            } else if (obj1Int < obj2Int){          //  NSComparisonResult的三个枚举值(1,-1, 0)

                return NSOrderedAscending;

            } else {

    return NSOrderedSame;

            }

        }];

    NSLog(@"%@", array2);

    字面量(简化代码)

    以下分别是不使用字面量和使用字面量的对比

    字符串的初始化

            //NSString *str = [NSString stringWithFormat:@"4545"];

            NSString *str = @"12332";

            NSLog(@"%@", str);

    数组的初始化

      //NSArray *arr = [NSArray arrayWithObjects : @"12", @"123", @"1234", nil];

            NSArray *arr = @[@"12", @"123", @"1234"];

    字典的初始化

    //NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil];

            NSDictionary *dic = @{@"key1": @"value1", @"key2": @"value2", @"key3": @"value3"};

    访问数组中相应下标的值

            //NSString *string1 = [arr objectAtIndex:1];

            NSString *string1 = arr[1];

            NSLog(@"%@", string1);

            访问字典中相应key对应的value

            //NSString *string2 = [dic valueForKey:@"key1"];

            NSString *string2 = dic[@"key1"];

            NSLog(@"%@", string2);

  • 相关阅读:
    Hystrix使用说明,配置参数说明
    服务限流 -- 自定义注解基于RateLimiter实现接口限流
    Java生产环境下问题排查
    Java垃圾回收(GC)机制详解
    RabbitMQ如何解决各种情况下丢数据的问题
    JWT如何在Spring Cloud微服务系统中在服务相互调时传递
    LeetCode 117th Weekly Contest 总结
    系统设计总结
    单调栈总结
    LeetCode 116th Weekly Contest 总结
  • 原文地址:https://www.cnblogs.com/liuyu521/p/3699425.html
Copyright © 2011-2022 走看看