• 块(block)


    块(block)

            block, 块语法,C语言函数的扩展, 允许在函数内部定义一个block, block执行效率比较高 

            block的语法(与函数指针的语法非常相似)

            返回值类型 (^block)(参数类型1参数名, 参数类型2参数名2, ...) = ^(参数类型1参数名, 参数类型2参数名2, ...){

                功能代码

            };

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

            block变量

            数据类型变量名 = 初值

     void (^blockName)() = ^() {
                NSLog(@"Hello, 你好");
                
            };     
            blockName();

            block的思路

            1.写成函数怎么写

            2.对照写出block()(输入inlineBlock, 会自动提示)  

            写一个block, "求一个数平方" 

    int (^doubleNumber)(int number) = ^(int number){
                return number * number;
            };
            
            NSLog(@"%d", doubleNumber(3));

    写一个block,求两个数的最大值

    int(^blockMax)(int, int) = ^(int a, int b) {
                return a > b ? a : b;
            };
            
            NSLog(@"max = %d", blockMax(3, 4));

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

    NSInteger(^changeToInt)(NSString *string) = ^(NSString *string) {
                return [string integerValue];
            };
            
            NSLog(@"%ld", changeToInt(@"12a3"));

    写一个block, 求一个字母对应的ACSII

    //1
            int(^changeASCII1)(char) = ^(char c) {
                int a = c;
                return a;
            };
            NSLog(@"%d", changeASCII1('a'));
        
            //2
            void(^changeASCII)(char) = ^(char a) {
                NSLog(@"%d", a);
            };
            changeASCII('a');

    写一个block, 求三个数的中间值

    int(^middleValue)(int, int, int) = ^(int a, int b, int c) {
                //1
                //return a > b ? (b > c ? b : (a > c ? c : a)) : (a > c ? a : (b > c ? c : b)) ;
                //2
                return a + b + c - MAX(MAX(a, b), c) - MIN(MIN(a, b), c);
            };
            NSLog(@"middle = %d", middleValue(3, 4, 5));

      block的使用

            1.使用typedefblock类型重命名

            typedef int (^BlockType)(int, int);   
            BlockType sum = ^(int a, int b){ return a + b; };
            NSLog(@"%d", sum(2, 3));

     2.block内部访问变量

            block内部不能够修改局部变量的值

    如果在block内部修改变量的值, 可以

            1.全局变量或静态变量

            2.__block修饰局部变量

            写一个block, 打印输出一个整数

    //        static int num = 1024;
            __block int  num = 1024;
            void(^printNumber)() = ^() {
                NSLog(@"%d", num);
                num++;
            };
            printNumber();
            printNumber();
            printNumber();

    数组排序

    NSArray *array = [NSArray arrayWithObjects:@"30", @"12", @"4", @"100" , @"1000", nil];

     1.提供相邻元素的比较方法

            缺点: 只能升序排序

            适用范围: 对姓名按照a->z排序

            NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)];
            NSLog(@"%@", sortArray);

    2.提供相邻元素的比较规则

           //写法1
            //比较规则 block
            NSComparisonResult(^rule)(NSString *, NSString *) = ^(NSString *str1, NSString *str2) {
                //满足NSOrderedAscending的条件, 决定了排序的结果
                if ([str1 intValue] > [str2 intValue]) {
                    return NSOrderedDescending;
                } else if ([str1 intValue] == [str2 intValue]) {
                    return NSOrderedSame;
                } else {
                    return NSOrderedAscending;
                }
            };
            
           NSArray *sortArray1 = [array sortedArrayUsingComparator:rule];
           NSLog(@"%@", sortArray1);
            
            //写法2
            NSArray *sortArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
                if ([obj1 intValue] < [obj2 intValue]) {
                    return NSOrderedDescending;
                } else if ([obj1 intValue] == [obj2 intValue]) {
                    return NSOrderedSame;
                } else {
                    return NSOrderedAscending;
                }
    
            }];
            NSLog(@"%@", sortArray2);
            Student *stu1 = [[Student alloc]initWithName:@"chenqiang" number:2 score:59.9];
            Student *stu2 = [[Student alloc]initWithName:@"bengbeng" number:28 score:40];
            Student *stu3 = [[Student alloc]initWithName:@"gexing" number:41 score:60];
            Student *stu4 = [[Student alloc]initWithName:@"yanglong" number:3 score:70];
            Student *stu5 = [[Student alloc]initWithName:@"yalong" number:61 score:61];
            
            NSArray *studentArray = [NSArray arrayWithObjects:stu1, stu2, stu3, stu4, stu5, nil];
    
            //分数由高到低
           NSArray *sortByscore = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *stu1 , Student *stu2) {
               if ([stu1 score] < [stu2 score]) {
                   return NSOrderedDescending;
               } else if ([stu1 score] == [stu2 score]) {
                   return NSOrderedSame;
               } else {
                   return NSOrderedAscending;
               }
           }];
           
            NSLog(@"%@", stu1);//类名+地址
            
            for (Student *stu in sortByscore) {
                [stu showStudents];
            }
            
        NSLog(@"
    ***********************华丽的分割线*********************************
    ");
            //姓名由a-z排序
            NSArray *sortByname = [studentArray sortedArrayUsingComparator:^NSComparisonResult(Student *stu1 , Student *stu2) {
    //            if ([[stu1 name] compare: [stu2 name]] == 1) {
    //                return NSOrderedDescending;
    //            } else if ([[stu1 name] compare: [stu2 name]] == 0) {
    //                return NSOrderedSame;
    //            } else {
    //                return NSOrderedAscending;
    //            }
    //            NSComparisonResult result = [[stu1 name] compare:[stu2 name]];
                return [[stu1 name] compare:[stu2 name]];
            }];
            
            for (Student *stu in sortByname) {
                [stu showStudents];
            }

    语法糖(syntactic sugar)

            1.数值(比如100 3.14 YES)前加@, 转化成NSNumber 

            NSNumber *number1 = [NSNumber numberWithInt:100];
            NSNumber *number2 = @100;
            NSNumber *number3 = @3.14;
            NSNumber *number4 = @YES;
            
            NSArray *numberArray = [NSArray arrayWithObjects:@100, @3.14, @YES, nil];

    2.@""快速创建一个字符串

            NSString *string1 = [[NSString alloc] initWithString:@"abc"];
            NSString *string2 = @"abc";

    3.@[]快速创建一个NSArray对象

            NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
            NSArray *array2 = @[@"a", @"b", @"c"];

    4.数组名[下标], 访问数组中的某个元素

            NSLog(@"%@", [array1 objectAtIndex:1]);
            NSLog(@"%@", array2[1]);

    5.@{}快速创建一个NSDictionary的对象

    NSDictionary *dic1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"xiaoming", @"name", @"", @"gender", @"18", @"age", nil];
            NSDictionary *dic2 = @{@"name":@"xiaoming", @"gender":@"", @"age":@"18"};

    6.字典名[key], key对应的value

            NSLog(@"%@", [dic1 objectForKey:@"name"]);
            NSLog(@"%@", dic2[@"name"]);
    The one who wants to wear a crown must bear the weight!
  • 相关阅读:
    tp-link便携式路由器固件升级方式
    awk改变了OFS,$0却没变化
    RBAC设计前期设计
    微信小程序获取普通二维码
    微信小程序获取请求数据
    微信小程序获取二维码API
    php之策略模式
    php之简单工厂模式
    数据库转换微信菜单
    实现微信公众号平台菜单功能
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4859421.html
Copyright © 2020-2023  润新知