OC第六讲(Block,语法糖)

一:

//

//  main.m


#import

#import "Student.h"

//函数声明

int maxValue (int a, int b);

//函数定义

int maxValue (int a, int b){

    return a > b ? a : b ;

}

//函数指针类型

//int (*)(int, int);

//函数指针变量

int (*aaa)(int, int) = NULL;

//重命名数据类型

typedefint (*AAA) (int, int);

//函数指针变量;i

AAA aa = NULL;

int main(int argc, const char * argv[]) {

 //函数调用

    int max = maxValue(1, 5);

    printf("%d\n", max);

 //函数指针变量指向函数的首地址

    aa = maxValue;

   int max1 = aa(6,3);//回调函数

    printf("%d",max1);

    

//block, 块语法, 实质是匿名函数,是对C语言中函数的扩展

    //块语法有时也被称为闭包

    //block实际上是由C语言实现的, 所以其执行效率很高

        //block的语法借鉴了函数指针的语法

    

    //block数据类型

    //返回值函数 (^)(参数类型1 参数名1, 参数类型2 参数名2)

    //注:1. 没有参数,括号不能省略

    //2. 参数名可以省略, 特殊情况下为了使用方便, 不省略

    

    //int (^)(int, int)

 

    

    //定义一个block变量

    int (^blockName)(int, int);

    //注:变量名写在幂符号(^)的后面

    

    //block的赋值(block实现)

    //^(参数类型1 参数名1, 参数类型2 参数名2,...){

    //执行代码

    //}

    //注:1.参数名不能够省略

    //2.如果block有返回值类型, 需要使用return返回数据

    

    blockName = ^(int a, int b){

        return a > b ? a : b;

        

    };

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

        NSLog(@"求最大值");

        return a > b ? a : b;

    };

    

    //block的使用(调用block)

    //block名字(实参1, 实参2, ...)

    NSLog(@"%d",blockName1(4, 9)) ;

    

    //注: block定义时, block块中的代码不会执行, block调用时block块中的代码才会执行!

    

    //定义一个block, 实现打印"Hello,world!"

    void (^blockPrint)();

    blockPrint = ^(){

        NSLog(@"Hello,world!");

    };

    

    blockPrint();

    

    //写一个返回值为整型参数为NSString (仅一个参数)的功能,现将字符串转换为整型的功能

    int (^convert)( NSString *) = ^(NSString *str){

        return [str intValue];

    };

    

    int a = convert(@"5我1爱2你3");

    NSLog(@"%d",a );//5

    

    //block的应用

    

    //1.使用typedef重命名block类型

    typedef int (^BlockType)(NSString *);

    BlockType convert1 = ^(NSString *str){

        return [str intValue];

    };

    

    int b = convert1(@"564545");

    NSLog(@"%d",b);

    

    //2.内部访问变量

    //注: a.block内部可以访问局部变量,但是不能修改局部变量,想要修改全局变量, 需要在变量前加修饰符__block

    //b.block可以访问并修改全局变量

    __block int a1 = 10;

        void (^print)()=^(){

        NSLog(@"%d",a1);

            a1++;

    };

    

    print();

    print();

    print();

    print();

    print();

    

    //3.block作为方法的参数

    

    NSArray *nameArray = [NSArrayarrayWithObjects:@"zhangsan",@"lisi",@"wangwu",@"zhaoliu", nil];

    NSArray *sortArray = [nameArraysortedArrayUsingSelector:@selector(compare:)];

    NSLog(@"%@",sortArray);

    

    

    NSArray *numberArray= [NSArray arrayWithObjects:@"1",@"2",@"3",@"21",nil];

    //只能排10以下

    NSArray *sortArray1 = [numberArraysortedArrayUsingSelector:@selector(compare:)];

    NSLog(@"%@",sortArray1);

    //完善的排序

    NSArray *sortArray2 = [numberArraysortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString  *obj2) {

       

        //相邻两个元素(obj1,obj2)的比较规则

        //系统排序以满足NSOrderedDescending的条件进行交换

        //注: 快速判断排好的数组, 以满足NSOrderedAscending的条件为准

        if ([obj1 intValue] < [obj2 intValue]) {

            returnNSOrderedDescending;

        }else if([obj1 intValue]==[obj2 intValue]){

            return NSOrderedSame;

            

        }else{

            returnNSOrderedAscending;

        }

    }];

    NSLog(@"%@",sortArray2);

    

   // NSArray *floatArray = [NSArray arrayWithObjects:@"2.3", @"5.8",@"54.45",@"545.2", nil];

    //使用block对数组进行降序排列

    

    Student *student = [StudentstudentWithName:@"wsan"number:56score:15.23];

    NSLog(@"%@",student.name);

    NSLog(@"%@",[student description]);

    

    Student *student1 = [Student studentWithName:@"esi" number:15score:45.2323];

    Student *student2 = [Student studentWithName:@"awu" number:45score:51.323];

    NSArray *stuArray = [[NSArray alloc]initWithObjects:student,student1,student2,nil];

    

    //按照学号由高到底进行排序

    

    NSArray *sortArray8 = [stuArraysortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student*obj2) {

        

        //相邻两个元素(obj1,obj2)的比较规则

        //系统排序以满足NSOrderedDescending的条件进行交换

        //注: 快速判断排好的数组, 以满足NSOrderedAscending的条件为准

        if (obj1.number  < obj2.number ) {

            returnNSOrderedDescending;

            

        }else if(obj1.number ==obj2.number){

            return NSOrderedSame;

            

        }else{

            returnNSOrderedAscending;

        }

    }];

    for (Student *temp in sortArray8) {

        NSLog(@"%@", temp);

    }

    

    //姓名从a-z

    NSArray *sortArray9 = [stuArraysortedArrayUsingComparator:^NSComparisonResult(Student *obj1,Student *obj2) {

//        if (obj1.name < obj2.name) {

//            return NSOrderedDescending;

//        }else if(obj1.name == obj2.name){

//            return NSOrderedSame;

//            

//        }else{

//            return NSOrderedAscending;

//        }

        return [obj1.name compare:obj2.name];

    }];

    for (Student *temp1 in sortArray9) {

        NSLog(@"%@",temp1);

    }

    

   //

    //语法糖

    //100

    NSNumber *n = [NSNumbernumberWithInteger:100];

    NSNumber *n1 = @100;

    NSString *string = [[NSString alloc]initWithString:@"123"];

    NSString *string1 = @"123";

    NSArray *arr = [NSArray arrayWithObjects:@"a",@"b", nil];

    NSArray *arr1 = @[@"a", @"b",@"c"];

    NSLog(@"%@",[arr1 objectAtIndex:2]);

    NSLog(@"%@",arr1[2]);

    NSDictionary *dic = [NSDictionarydictionaryWithObjectsAndKeys:@"111",@"1",@"2",@"222", nil];

    NSDictionary *dic1 = @{@"1":@"111",@"2":@"222"};

    

    NSLog(@"%@",[dic objectForKey:@"2"]);

    NSLog(@"%@",dic[@"2"]);

        return 0;

}

​二:

//

//  Student.h


#import

@interface Student : NSObject

//姓名, 学号, 分数

//遍历构造器, 自定义初始化方法

@property (nonatomic,retain)NSString *name;

@property NSInteger number;

@propertyCGFloat score;

- (id)initWithName:(NSString *)name number:(NSInteger)number score:(CGFloat)score;

+ (id)studentWithName:(NSString *)name number:(NSInteger)number score:(CGFloat)score;

//输出信息

- (void)sayHi;

@end

​三:

//

//  Student.m



#import "Student.h"


@implementation Student


- (id)initWithName:(NSString *)name number:(NSInteger)number score:(CGFloat)score{

    if (self = [super init]) {

        _name = name;

        _number =number;

        _score =score;

    }

    return self;

    

    

}

+ (id)studentWithName:(NSString *)name number:(NSInteger)number score:(CGFloat)score{

    return [[Student alloc]initWithName:name number:numberscore:score];

}


- (NSString *)description

{

    return [NSString stringWithFormat:@"name:%@ number: %ld  score:%.2lf", _name,_number,_score];

}





@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值