您的位置:首页 > 编程语言

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

2015-11-03 00:00 260 查看
摘要: 代码块:代码块对象(简称“代码块”)是对C语⾔言中函数的扩展
在 Object—C 里 闭包就是代码块 闭包是将一些变量绑定在环境中 闭包的绑定分为:托管型,自动型, 代码块相当一个变量,与变量不同的是,代码块用来存储函数
// 定义方法1:
// 返回类型 (^代码块名字)(参数类型);
// 代码块名字=^(参数列表){代码块所会执行函数}
// ^脱字符
// 定义方法2:

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

// 最简单的无返回无参数的代码块
// 定义一个代码块

构造块的关键字typedef,这样做是在构造了一个块的类型。使...

#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(@"1至10求和结果:%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);

//递归方式计算1到10的和

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息