首页 > 代码库 > 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);