//Block的定义:Block也是一个函数,称为一个语法块(实现某个特定功能),只不过Block是一个比较特殊的函数,没有函数名称的函数,又叫做匿名函数
格式:
返回值类型 (^Block变量名称) (参数列表) = 返回值类型(可以省略) ^(参数列表(一定要有参数名称))
{
Block的实现部分
};
#import
#import "Person.h"
//Block重定义
typedef int (^newBlock)(int ,int);
int count = 18;//定义一个全局变量,不管在 main函数内部还是在外部都可以访问和使用
int main(int argc, const char * argv[]) {
@autoreleasepool {
//用Block实现求两个数之间的最大值
int (^maxBlock)(int,int) = ^(int a,int b){
return a > b ? a : b;
};//分号不可以省略,表示Block语法的结束
//Block调用 使用Block变量名(参数)调用
int max = maxBlock(17,10);
NSLog(@"max = %d",max);
//无参无返回值
void (^sayHiBlock) () = ^(){
NSLog(@"Hello!");
};
//Block调用
sayHiBlock();//此时括号不能省略
__block int num3 = 100;//定义一个局部变量
//有参数无返回值
void (^printfBlock) (int) = ^(int number){
NSLog(@"number = %d",number);
//改变全局变量count的值
count++;//在Block语法块(实现部分)可以修改和访问全局变量
num3++;//在Block当中,不可以直接修改局部变量的值,如果想修改局部变量的值则需要在局部变量之前加上__block修饰,其作用是__block修饰符可以让Block正常访问到其它函数的局部变量以及修改,保护局部变量的可读性,(保护局部变量还能被其他函数访问以及修改)
};
//Block调用
printfBlock(78);
printf("count = %d\n",count);
//练习 求两个数的和
// int (^sumBlock)(int ,int) = ^(int a,int b){
// return a + b;
// };
// int sum = sumBlock(80,5);
// NSLog(@"sum = %d",sum);
//求和第二种方式
newBlock sumBlock = ^(int a ,int b){
return a + b;
};
int sum = sumBlock(20,8);
NSLog(@"sum = %d",sum);
newBlock mutBlock = ^(int a,int b){
return a * b;
};
int mut = mutBlock(10,45);
NSLog(@"mut = %d",mut);
//写一个返回值为整型,参数为OC字符串的Block类型(仅一个参数),实现将字符串转换为整型的功能
int (^myBlock)(NSString *) = ^(NSString *str){
return [str intValue];
};
NSString *str = @"15";
int b = myBlock(str);
NSLog(@"%d",b);
//练习,定义一个Block,用来比较两个OC字符串的大小
NSComparisonResult (^stringCompareBlock)(NSString *,NSString *) = ^(NSString *object1,NSString *object2){
//返回值是一个枚举
return [object1 compare:object2];
};
//Block调用
NSString *str1 = @"xiaolong";
NSString *str2 = @"anlong";
NSComparisonResult result = stringCompareBlock (str1,str2);
NSLog(@"result = %ld",result);
//练习,定义一个Block,用来比较两个整数的大小
NSComparisonResult (^intCompareBlock)(NSInteger ,NSInteger) = ^(NSInteger num1,NSInteger num2){
// return [[NSNumber numberWithInteger:num1] compare:[NSNumber numberWithInteger:num2]];//必须先将基本数据类型转化为OC对象之后,再调用compare方法
return [@(num1) compare:@(num2)];//语法糖写法
};
NSComparisonResult result2 = intCompareBlock(12,18);
NSLog(@"result2 = %ld",result2);
//不可变数组的排序
NSArray *arr = @[@"YaMing",@"Frank",@"DouDou",@"Jason"];
//调用不可变数组的排序的方法 第一种方法
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"arr = %@",arr);
NSLog(@"newArr = %@",newArr);
//第二种方法
NSArray *blockArr = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"blockArr = %@",blockArr);
//可变数组的排序方法 第一种
NSMutableArray *mutArr = [@[@"YaMing2",@"Frank2",@"DouDou2",@"Jason2"] mutableCopy];
//调用可变数组的排序方法
[mutArr sortUsingSelector:@selector(compare:)];//因为本身就是个可变数组,所以不需要有返回值
NSLog(@"mutArr = %@",mutArr);
//第二种
[mutArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
//return -[obj1 compare:obj2];//价格符号,取反,降序排列
}];
NSLog(@"mutArr = %@",mutArr);
**********************************************
Person.h
#import
@interface Person : NSObject
{
NSString *_Name;
NSString *_Sex;
NSInteger _Age;
CGFloat _Height;
}
//setter getter
- (void)setName:(NSString *)name;
- (NSString *)Name;
- (void)setSex:(NSString *)sex;
- (NSString *)Sex;
- (void)setAge:(NSInteger)age;
- (NSInteger)Age;
- (void)setHeight:(CGFloat)height;
- (CGFloat)height;
-(id)initWithName:(NSString *)name
Sex:(NSString *)sex
Age:(NSInteger)age
Height:(CGFloat)height;
//便利构造器
+(id)PersonWithName:(NSString *)name
Sex:(NSString *)sex
Age:(NSInteger)age
Height:(CGFloat)height;
//输出信息
-(void)sayHi;
@end
**********************************************
Person.m
#import "Person.h"
@implementation Person
- (void)setName:(NSString *)name{
_Name = name;
}
- (NSString *)Name{
return _Name;
}
- (void)setSex:(NSString *)sex{
_Sex = sex;
}
- (NSString *)Sex{
return _Sex;
}
- (void)setAge:(NSInteger)age{
_Age = age;
}
- (NSInteger)Age{
return _Age;
}
- (void)setHeight:(CGFloat)height{
_Height = height;
}
- (CGFloat)height{
return _Height;
}
-(id)initWithName:(NSString *)name
Sex:(NSString *)sex
Age:(NSInteger)age
Height:(CGFloat)height{
self = [super init];
if (self) {
_Name = name;
_Sex = sex;
_Age = age;
_Height = height;
}
return self;
}
//便利构造器
+(id)PersonWithName:(NSString *)name
Sex:(NSString *)sex
Age:(NSInteger)age
Height:(CGFloat)height{
Person *per = [[Person alloc] initWithName:name Sex:sex Age:ageHeight:height];
return per;
}
//输出信息
-(void)sayHi{
NSLog(@"name:%@ sex:%@ age:%ld heght:%.2f",_Name,_Sex,_Age,_Height);
}
@end
**********************************************
main.m
//Block排序
//创建几个Person对象
Person *per1 = [Person PersonWithName:@"DouDou" Sex:@"f" Age:23Height:163.8];
Person *per2 = [Person PersonWithName:@"XiaoLong" Sex:@"m" Age:18Height:178.5];
Person *per3 = [Person PersonWithName:@"MingMing" Sex:@"m" Age:31Height:188.2];
Person *per4 = [Person PersonWithName:@"MaoMao" Sex:@"m" Age:29Height:176.3];
//定义一个可变数组,将对象存储到数组当中
NSMutableArray *perMutArr = [@[per1,per2,per3,per4] mutableCopy];
//按照姓名排序
[perMutArr sortUsingComparator:^NSComparisonResult(Person *obj1,Person *obj2) {
//比较姓名的大小
NSComparisonResult result = [[obj1 Name] compare:[obj2 Name]];
//如果姓名相同,则按照年龄排序
if (result == NSOrderedSame) {
//按照年龄排序
result = [@([obj1 Age]) compare:@([obj2 Age])];
}
return result;
}];
NSLog(@"按照姓名排序好的Person对象为:");
//遍历数组,输出每个对象的信息
for (id obj in perMutArr) {
[obj sayHi];
}
//按照身高排序
[perMutArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [@([obj1 height]) compare:@([obj2 height])];
}];
//遍历数组,输出每个对象的信息
for (id obj in perMutArr) {
[obj sayHi];
}
}
return 0;
}