• OC基础第五讲--Block、数组高级、字面量


    Block

    1.1block与函数指针

    函数:

    int sum(int x, int y)

    {

      retrun x + y;

    }

    函数指针:

    把上面函数原型int sum(int x, int y)中的函数名替换成(*p),即可得到一个函数指针int (*p)(int x, int y)。

    这个函数表示指针p指向一个函数,这个函数有两个int型参数,返回值是int类型。

    Block:把函数指针int (*p)(int x, int y)中的'*'换成'^'就是我们block的声明,即int (^p)(int x, int y)

    (int x, int y)还是表示参数,返回值还是int型。

    1.2block定义与语法

      定义:有名称的函数可以直接通过函数名来调用,或者通过函数指针来调用,那没有名称的函数只能通过block来调用,block是匿名函数(没有名称的函数),block变量存放着函数的实现,通过block变量能直接调用函数。

    语法:声明并实现一个block

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

                return a + b;

            };

    上面这个block的功能是返回两个整数的和,需要注意的是,具体实现用"{}"括起来,并且外面有';'。等号右边的参数列表不能省略参数名,左边的可以省略。 

    1.3block的使用

    1.3.1 重定义

    我们知道,函数指针可以重定义,同样的,我们也可以对block进行重定义

    对int (int, int)进行重定义typedef int (^BlockType) (int, int),那么现在BlockType类型就等同于int(int, int)

    上面的block就可以简化为:

    BlockType myBlock = ^ (int a, int b){

                return a + b;

            };

    1.3.2block与局部变量

    block内部,全局变量可以访问与修改;

    但是局部变量只能访问,不能修改,如果非要修改,可以在定义局部变量的时候在数据类型前加__block

            __block int count = 5;

            int (^block4)(int) = ^ (int x){

                count ++;

                return x * count;

            };

            NSLog(@"%d", block4(10));

    Block 与 数组排序

    2.1字符串排序

    NSArray *array = [NSArray arrayWithObjects:@"abc1", @"abc5", @"abc2", @"abc9", nil];

            NSComparator sortBlock = ^(id obj1, id obj2){

                return [obj1 compare:obj2];

            };

            array = [array sortedArrayUsingComparator:sortBlock];

            NSLog(@"排序后:%@", array);

    2.2数值排序

    因为普通的数据类型不能存在数组中,数组中只能存放对象,所以要对数组中的字符串进行数值排序,就必须先把字符串转成数值类型

     NSArray *array2 = [NSArray arrayWithObjects:@"12", @"23", @"1", nil];

        array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

    NSInteger obj1Int = [obj1 integerValue];       //  把字符串转成数值

    NSInteger obj2Int = [obj2 integerValue];

    if (obj1Int > obj2Int) {

                return NSOrderedDescending;      //  NSOrderedDescending,NSOrderedAscending,NSOrderedSame是

            } else if (obj1Int < obj2Int){          //  NSComparisonResult的三个枚举值(1,-1, 0)

                return NSOrderedAscending;

            } else {

    return NSOrderedSame;

            }

        }];

    NSLog(@"%@", array2);

    字面量(简化代码)

    以下分别是不使用字面量和使用字面量的对比

    字符串的初始化

            //NSString *str = [NSString stringWithFormat:@"4545"];

            NSString *str = @"12332";

            NSLog(@"%@", str);

    数组的初始化

      //NSArray *arr = [NSArray arrayWithObjects : @"12", @"123", @"1234", nil];

            NSArray *arr = @[@"12", @"123", @"1234"];

    字典的初始化

    //NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil];

            NSDictionary *dic = @{@"key1": @"value1", @"key2": @"value2", @"key3": @"value3"};

    访问数组中相应下标的值

            //NSString *string1 = [arr objectAtIndex:1];

            NSString *string1 = arr[1];

            NSLog(@"%@", string1);

            访问字典中相应key对应的value

            //NSString *string2 = [dic valueForKey:@"key1"];

            NSString *string2 = dic[@"key1"];

            NSLog(@"%@", string2);

  • 相关阅读:
    输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少
    有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
    写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
    有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
    有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43 写一函数实现以上功能,在主函数中输人n个整数和输出调整后的n个数
    输入10个整数,将其中最小的数与第一个数对换, 把最大的数与最后一个数对换
    LOJ#3271. 「JOISC 2020 Day1」建筑装饰 4 DP+找规律
    LOJ#3160. 「NOI2019」斗主地 打表+拉格朗日插值
    CF1386C Joker 双指针+动态树
    LuoguP2605 [ZJOI2010]基站选址 线段树优化DP
  • 原文地址:https://www.cnblogs.com/liuyu521/p/3699425.html
Copyright © 2020-2023  润新知