首页 > 代码库 > OC基础第五讲--Block、数组高级、字面量

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);