block 块语法. --- 匿名函数
block可以在函数内部定义匿名函数.
blocK -- 实现两个数的最大值.
#import <Foundation/Foundation.h> #import "Person.h" //1.输出I love ios void output() { printf("I love ios\n"); } //2.求两个数的最大 int maxValue(int x, int y) { return x > y ? x : y; } int main(int argc, const char * argv[]) { @autoreleasepool { //方法一:直接打印 output(); int max = maxValue(2, 5); printf("max = %d", max); //方法二:定义指针变量 void (*p)() = NULL; p = output; //指针指向对应的函数; p(); int (*p)(int, int) = NULL; p = maxValue; int max = p(2, 5); printf("max = %d", max); //方法三:函数重命名(打印多个同类型,会比较方便) typedef int (*PFUN)(int, int); //将函数类型重命名为PFUN PFUN p1 = NULL; p1 = maxValue; int max = p1(2, 5); printf("max = %d", max);
//第四种方法 --- block int (^max)(int, int) = ^int(int a, int b) { return a > b ? a : b; }; //如何调用block块 int value = max(4, 6); printf("value = %d", value);
Block ---- 块语法
1.输出I love ios typedef void (^Hi)(); Hi sayHi = ^void() { NSLog(@"I love ios\n"); }; sayHi();
2.定义block, 将整数转换为字符型 typedef NSString *(^TranForm1)(int); TranForm1 change = ^NSString *(int c) { return [NSString stringWithFormat:@"%d", c]; }; NSString *str = change(9); NSLog(@"str = %@", str);
3.定义block,将整数转换为NSNumber对象 typedef NSNumber *(^TranForm2)(int); TranForm2 change1 = ^NSNumber *(int c1) { return @(c1); }; NSNumber *num = change1(4); NSLog(@"%@", num);
4.定义block, 将字符串全部转化为大写 typedef NSString *(^TransForm3)(NSString *); TransForm3 change3 = ^NSString *(NSString *c2) { return [c2 uppercaseString]; }; NSString *str1 = change3(@"I love ios"); NSLog(@"str1 = %@", str1);
5.定义block,实现求字符串的长度 typedef NSUInteger (^Str)(NSString *); Str length = ^NSUInteger (NSString *c3) { return [c3 length]; }; NSUInteger length1 = length(@"jideh"); NSLog(@"%lu", length1);
6.定义block,实现求数组中元素的个数 typedef NSUInteger (^Str)(NSArray *); Str count1 = ^NSUInteger (NSArray *c4) { return [c4 count]; }; NSUInteger count = count1(@[@"i", @"ji", @"ghud"]); NSLog(@"%lu", count);
7.定义block,实现两个整数的比较 typedef NSComparisonResult (^NSComparison)(NSInteger, NSInteger); NSComparison compare = ^NSComparisonResult (NSInteger a, NSInteger b) { return a > b ? NSOrderedDescending : a == b ? NSOrderedSame : NSOrderedAscending; }; NSComparisonResult result = compare(6, 7); NSLog(@"%ld", result);
8.定义block, 两个字符串比较 typedef NSComparisonResult (^Compare1)(NSString *, NSString *); Compare1 compare1 = ^NSComparisonResult (NSString *str1, NSString *str2) { return [str1 compare:str2]; }; NSComparisonResult result1 = compare1(@"jdshf", @"sjd"); NSLog(@"result1 = %ld", result1);
9.定义block, 两个NSnumber比较 typedef NSComparisonResult (^Compare3)(NSNumber *, NSNumber *); Compare3 compare2 = ^NSComparisonResult (NSNumber *str1, NSNumber *str2) { return [str1 compare:str2]; }; NSComparisonResult result2 = compare2(@36, @87); NSLog(@"result2 = %ld", result2);
数组的升序排序
//不可变数组升序 NSArray *arr1 = @[@"jdi", @"Hu", @"fk", @"kdi", @"dj"]; NSArray *sortedArr = [arr1 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@", sortedArr);
block 实现降序排序
//block可以用于给没有源代码的类,添加方法(假象) NSArray *arr2 = @[@"ii", @"aa", @"dd",@"cc"]; NSArray *sortArr = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { //实现排序block. //将obj1和obj2转化为字符串形式 NSString *str1 = (NSString *)obj1; NSString *str2 = (NSString *)obj2; return -[str1 compare:str2]; //(compare默认当前者比后者大时,返回1,两者调换,升序)符号表示降序 或obj1和obj2点换位置(也表示降序) }]; NSLog(@"%@", sortArr);
Student *stu1 = [Student studentWithName:@"xiaoming" age:19 score:90 number:1536]; Student *stu2 = [Student studentWithName:@"xiaohua" age:28 score:35 number:7474]; Student *stu3 = [Student studentWithName:@"jiajai" age:28 score:64 number:3785]; Student *stu4 = [Student studentWithName:@"xiaohong" age:29 score:23 number:3647]; NSMutableArray *mArry = [NSMutableArray arrayWithObjects:stu1, stu2, stu3, stu4, nil]; //按年龄升序排序 [mArry sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Student *stu1 = (Student *)obj1; Student *stu2 = (Student *)obj2; NSInteger age1 = [stu1 age]; NSInteger age2 = [stu2 age]; return [@(age1) compare:@(age2)]; }]; NSLog(@"%@", mArry); //按成绩降序 [mArry sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { return -[@([(Student *)obj1 score]) compare:@([(Student *)obj2 score])]; }]; //按姓名降序 [mArry sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Student *stu1 = (Student *)obj1; Student *stu2 = (Student *)obj2; NSString *name1 = [stu1 name]; NSString *name2 = [stu2 name]; return -[name1 compare:name2]; //name本身就是字符串所以不用转换 // return [[(Student *)obj2 name] compare:[(Student *)obj1 name]]; }]; //按学号升序 [mArry sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { // Student *stu1 = (Student *)obj1; // Student *stu2 = (Student *)obj2; // NSInteger number1 = [stu1 number]; // NSInteger number2 = [stu2 number]; // return [@(number1) compare:@(number2)]; return [@([(Student *)obj1 number]) compare:@([(Student *)obj2 number])]; }]; // //按年龄升序排序 // [mArry sortUsingSelector:@selector(compareByAge:)]; // NSLog(@"%@", mArry); // //按成绩降序排序 // [mArry sortUsingSelector:@selector(compareByScore:)]; // NSLog(@"%@", mArry); // //按姓名降序排序 // [mArry sortUsingSelector:@selector(compareByName:)]; // NSLog(@"%@", mArry); // //按学号升序排序 // [mArry sortUsingSelector:@selector(compareByNumber:)]; // NSLog(@"%@", mArry);