iOS开发学习第十九课——匿名函数 Block

来源:互联网 发布:杭州最帅交警网络走红 编辑:程序博客网 时间:2024/06/03 19:23
//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;
}
0 0