1103学习代码块构造块静态块


#import <Foundation/Foundation.h>


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

    @autoreleasepool {

        // insert code here...

        NSLog(@"Hello, World!");

//        Object—C 闭包就是代码块

//        闭包是将一些变量绑定在环境中

//        闭包的绑定分为:托管型,自动型

        

//        代码块相当一个变量,与变量不同的是,代码块用来存储函数

        

//        闭包可以存储函数的变量

//        定义方法1

//        返回类型 ^代码块名字)(参数类型);

//        代码块名字=^(参数列表){代码块所会执行函数}

//        ^脱字符

//        定义方法2

        

//        返回类型 ^代码块名字)(参数类型)=^(参数列表){代码块所会执行函数}

        

//        最简单的无返回无参数的代码块

//        定义一个代码块

        void (^my_block)(void)=^(void){

            NSLog(@"hello");

       

        };

//        调用,注意,这是一个无返回值的代码块,只要调用就可以,执行代码块内的代码,调用方式:代码块名字()

        my_block();

        

        

        

        //这是一个有参数有返回值的代码块

        int (^myMethod)(int)=^(int number){

            return number*number;

        };

//        在调用时需要在括号里填入参数。可以用变量接收

        int num=myMethod(4);

        NSLog(@"myMethod:%i",num);

        

        //第二种定义方式:当我们定义一个代码块时,在先声明时,只需要写等号前面定义部分,不去写赋值部分

        void (^Block)(int );

        Block=^(int num){

            NSLog(@"传入参数为%i",num);

        };

        Block(8);

        

        //构造块的关键字typedef,这样做是在构造了一个块的类型。使代码块看起来更加简洁。

       // 注意:在使用typedef时会提示参数 typed name,这就是说将要在定义构造块时需要返回类型和名字(参数)

        typedef void (^My_BLOCK)(void);

        My_BLOCK block1=^(void){

            NSLog(@"hello,world");

        };

        block1();

        

        

        //----传多个参数的代码块(参数之间用逗号隔开,后面参数列表需要和前面定义相对应)

        int (^add_block)(int ,int)=^(int num1 ,int num2){

            return num1+num2;

        };

        int sum=add_block(2,3);

        NSLog(@"sum:%i",sum);

        

        int a=10;

        

        int (^test_block)(int)=^(int num){

            

            

            return a+num;

        };

        

        

        NSLog(@"%i",test_block(2));

        int addSum=0;

        for (int i=1; i<11; i++) {

            addSum=add_block(addSum,i);

        }

        NSLog(@"110求和结果:%i",addSum);

        

        int number3=add_block(add_block(add_block(1,3),3),add_block(2,4));

        NSLog(@"%i",number3);

        

        NSArray *array=@[@"hello",@"apple",@"world"];

        NSArray *arr= [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

           return  [obj1 compare:obj2];

            

        }];

        NSLog(@"%@",arr);

        

        

        

        //递归方式计算110的和

        

        static int (^sum_block)(int )=^(int num1){

            if (num1<10) {

                num1=sum_block(num1+1)+num1;

               

            }

             NSLog(@"sum:%i",num1);

            return num1;

        };

        NSLog(@"%i",sum_block(1));

        

        

        static int number_1=10;

        int (^test)(void)=^{

            number_1+=2;

            

            return number_1;

        };

        NSLog(@"=====>number_1:%i     --->代码块返回值:%i",number_1,test());

        

        

        //复习:普通代码块的定义:

//        方法一:

//        返回类型 ^代码块名称)(参数类型,参数类型);//定义声明

//        代码块名称=^(参数类型 参数名,参数类型 参数名){

//            代码块内容

//        };//注意结尾打分号

//        方法二:

//        返回类型 ^代码块名称)(参数类型,参数类型)=^(参数类型 参数名,参数类型 参数名){

            //            代码块内容

            //        };

//        构造块的定义:typedef构造块的关键字

//        typedef 返回类型type 所要定义代码块的类型的名(^ name 参数类型(可以有多个,以逗号隔开);

//        name是代码块类型,在之后定义代码块可以用name做为类型,但是这样定义的代码块返回值类型,参数类型,参数个数是规定好的

        

//        静态块:关键字:static--->定义方式:在普通代码块形式前加关键字,使用仍是用代码块名字。一般在递归调用定义这样的类型

        

//        代码块除了封装函数体还可以参数使用(这样的代码块需要有返回值)

        

        NSArray *arrayI=@[@"s",@"d",@"f",@"e"];

//        NSComparisonResult (^sort)(id ,id)=^(id object1,id object2){

//            return [object1 compare:object2];

//        };

        

        NSArray *sortArray=[arrayI sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

            NSLog(@"obj1:%@ obj2:%@",obj1,obj2);

            return [obj1 compare:obj2];

        }];

        NSLog(@"%@",sortArray);

        

        

        

        

        

        

        

        

        

    }

    return 0;

}


你可能感兴趣的:(静态块,代码块,构造块)