OC中的Block(块语法)相关知识

时间:2020-12-04 05:14:18

Block的数据类型

格式:

返回值类型: (^)(参数类型1参数名1, 参数类型2 参数名2, ...)

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

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

block赋值(实现)

        //格式:

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

        //              执行代码

        //}

        

       :

           1. 参数名不能省略

           2.如果block有返回值,需要使用return返回值

Block的运用

1. 

使用typedefblock类型重命名

例:

OC中的Block(块语法)相关知识

2.block内部访问变量

//block内部不能修改局部变量, 可以修改全局变量

//block内部修改局部变量,需要在局部变量前加__block

3.block作为方法的参数(block排序)

例: 对一个数组内的字符串(数字)进行排序

        //字符串是数字时的排序

        NSArray *array3 = [NSArray arrayWithObjects:@"123", @"10", @"43", @"5", nil];

        //使用block定义一个块方法

        NSComparator ruleArray = ^(NSString *oil1, NSString *oil2) {

            //字符串转为整型

            NSInteger num1 = [oil1 integerValue];

            NSInteger num2 = [oil2 integerValue];

            //判断大小

            if (num1 > num2) {

                return NSOrderedDescending;//1

            }

            if (num1 < num2) {

                return NSOrderedAscending;//-1

            }

            return NSOrderedSame;

        };

        NSArray *soft3 = [array3 sortedArrayUsingComparator:ruleArray];

        NSLog(@"%@", soft3);


再来一个例子, 对一个学生数组, 按照学生成绩和姓名进行排序

Student *stu1 = [[Student alloc] initWithName:@"耿申" score:59.9];

        Student *stu2 = [[Student alloc] initWithName:@"杨超" score:98];

        Student *stu3 = [Student studentWithName:@"李高杰" score:80];

        Student *stu4 = [Student studentWithName:@"葫芦娃" score:70];

        

        //学生数组

        NSArray *studentArray = [NSArray arrayWithObjects:stu1, stu2, stu3, stu4, nil];

        //排序的学生数组

        NSArray *sotr1 = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {

            if ([obj1 score] > [obj2 score]) {

                return -NSOrderedDescending;//1

            }

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

                return -NSOrderedAscending;//-1

            }

            return NSOrderedSame;

        }];

        NSLog(@"---------按分数排序--------");

        for (Student *stu in sotr1) {

            NSLog(@"%@", stu);

        }

        NSLog(@"---------按姓名排序--------");

        NSArray *sort = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {

            //获取两个相邻函数的名字

            NSString *name1 = [obj1 name];

            NSString *name2 = [obj2 name];

//先将汉字转化为拼音, 进行比较, 排序

            //可变字符串1

            NSMutableString *str1 = [NSMutableString stringWithString:name1];

            //转成带声调的拼音

            CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformToLatin, false);

            //转成没有声调的拼音

            CFStringTransform((CFMutableStringRef)str1, NULL, kCFStringTransformStripDiacritics, false);

            

            //可变字符串2

            NSMutableString *str2 = [NSMutableString stringWithString:name2];

            //转成带声调的拼音

            CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformToLatin, false);

            //转成没有声调的拼音

            CFStringTransform((CFMutableStringRef)str2, NULL, kCFStringTransformStripDiacritics, false);

            return [str1 compare:str2];

        }];

        

        for (Student *stu1 in sort) {

            NSLog(@"%@", stu1);

        }

注: 这里面有一段方法是将汉字转化为拼音的, 不过有一定的局限性, 如果汉字是多音字的时候, 可能会转化的不太准确, 请大家慎重使用

以上个人总结的一些东西, 如果大家发现有错的话, 欢迎提出来, 大家一起进步哦!OC中的Block(块语法)相关知识