iOS Block的基本使用分分快三计划

作者:分分快三计划
 1 function sum(numberOne) {
 2               var count = numberOne;
 3               return function by(numberTwo) {
 4                 if (numberTwo === undefined) {
 5                   return count;
 6                 } else {
 7                   count  = numberTwo;
 8                   return by;
 9                 }                            
10               }
11         }
12         console.log(sum(10)(12)(30)());

1.几种类型的Block

Block的定义方式:

归来类型(^block变量名卡塔尔国(参数列表卡塔尔(英语:State of Qatar) = ^(形参列表卡塔尔国{};

系统提供了七个定义block的宏,输入inlineBlock就能不由自主

<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
        <#statements#>
};

Mysql带再次来到值与不带再次来到值的2种存款和储蓄进程写法,mysql存款和储蓄进度

经过1:带重回值:

 drop procedure if exists proc_addNum;
 create procedure proc_addNum (in x int,in y int,out sum int)
 BEGIN
 SET sum= x   y;
 end

接下来,实行进度,out输出重返值:

 call proc_addNum(2,3,@sum);
select @sum;

进度2:不带再次回到值:

 drop procedure if exists proc_addNum;
 create procedure proc_addNum (in x int,in y int)
 BEGIN
 DECLARE sum int;
 SET sum= x   y;
 SELECT sum;
 end

实践进度:

 call proc_addNum(2,3);

总结

以上所述是笔者给我们介绍的Mysql带重返值与不带再次来到值的2种存款和储蓄进度写法,希望对大家所有利于,假若我们有此外难点款待给本人留言,作者会及时过来大家的!

进程1:带重回值: drop procedure if exists proc_addNum; create procedure proc_addNum (in x...

写法一

1.2 无参数有再次来到值的block
int(^getNum)() = ^(){
    return 1;
};
NSLog(@"%d", getNum());

写法二

3 Block传值

估值那是事关block第叁个就想到的意义了,block能够完成页面间的传值功能,直接上例子。
先在其次个页面包车型客车.h文件里声称三个block

typedef void(^block)(NSString);

@interface ViewControllerTwo : UIViewController

@property (strong, nonatomic) block aBlock;

@end

分分快三计划,下一场写下回调方法

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (self.aBlock) {
        self.aBlock(@"回调传值");
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

然后再次回到第贰个页面引进头文件,写跳转情势

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    ViewControllerTwo *VC = [ViewControllerTwo new];
    VC.aBlock = ^(NSString *str){
        NSLog(@"%@", str);
    };
    [self presentViewController: VC animated:YES completion:nil];
}

那样block传值就完事了。

动用闭包的格局达成叁个累计函数 addNum,参数为 number 类型,每趟回到的结果 = 上三次总括的值 传入的值,如: addNum(10卡塔尔(قطر‎; //10 addNum(12卡塔尔(قطر‎; //22 addNum(30卡塔尔; //52

1.3 有参数无再次回到值的block
void(^blockName)(int) = ^(int a){
    NSLog(@"%d", a);
};
blockName(3);
 1 function sum (n) {
 2             
 3             var v = function (x) {
 4                 return sum (n   x);
 5             };
 6 
 7             v.valueOf = v.toString = function () {
 8                 return n;
 9             };
10 
11             return v;
12         }
13 
14         console.log( sum(10)(12)(30));

4 Block的巡回援用

在block内部选拔self早前,写上这么一句代码

__weak typeof(self) weakSelf = self;

下一场将block使用的self全体替换到weakSelf就足以制止循环援引了。

截至语:限于水平,本文只写了有的大旨用法和注意事项,假设文中留存不当请建议,小编会立Matthew改。

 

例行科学普及

Block 是 iOS4 之后加上的后生可畏种语法构造,也变为闭包,或然匿名函数,在iOS开垦进度中采取相当多,使用也相比方便,朝齑暮盐于传值、回调等。

 1 function sum(x) {
 2             var result = 0;
 3             for(var i=0;i<arguments.length;i  ){
 4                 result  = arguments[i];
 5             }
 6             var foo = function(){
 7                 for(var i=0;i<arguments.length;i  ){
 8                     result  = arguments[i];
 9                 }
10                 return foo;
11             };
12             foo.toString = function(){
13                 return result;
14             };
15             return foo;
16         }
17 
18         console.log( sum(10)(12)(30));
2.2 Block作为重返值

Block作为重返值看起来就比较奇异了,最朝齑暮盐的正是masomry了,对正是极度点来点去的,看起来高大上的语法,也正是链式编制程序。
先在ViewController里证明了几个天性,来贮存数据

@property (nonatomic, assign)int result;

接下来写再次回到block的法子:

- (ViewController *(^)(int))addNum
{
    return ^(int number){
        _result  = number;
        return self;
    };
}

调用:

self.addNum(1).addNum(2).addNum(3);
NSLog(@"%d", _result);

表达起来应当正是如此的:
self.addNum也等于get方法的调用:[self addNum];
self.addNum重回的是一个block,所以你能够给她贰个参数1,于是写成这么:self.addNum(1卡塔尔(قطر‎
然后block重返的又是self,所以三番五次调用addNum
诸有此类生生不息下去.......
Viewcontroller可以换到其它三个类,达成形式是同意气风发的

写法三

1.4 有参数有重临值的block
int(^addNum)(int, int) = ^(int a, int b){
    return a   b;
};
NSLog(@"%d", addNum(242, 424));

2 上边三种只是block的低档用法,上面来点中级的。

1.5 Block的重命名

block的写法仍然比较劳苦的,所以系统提供了三个重命名的功用

typedef void(^blockType)(int, int);

那般写的话,三个有三个参数,无重回值的block类型就改成了blockType,然后只要求用那一个类型申明block就足以了。

@property (strong, nonatomic) blockType aBlock;
2.3 Block对表面变量的改革
int a = 3;
void(^block)() = ^{
  NSLog(@"%d",a);
};
a = 5;
block();

你能够看到,打字与印刷出来的a的值是5,也正是说,block获取的是a的值,也便是3,所以当a造成5的时候,block内部打字与印刷的值并从未改观。

static int a = 3;
void(^block)() = ^{
    NSLog(@"%d",a);
};
a = 5;
block();

其一应该就毫无解释了,和上面是相反的结果,block内部打字与印刷的值会随着a的值退换而修改,也正是说block获取的是a的指针。
总括起来便是:
(1卡塔尔假如是一些变量,Block获取的是值。
(2卡塔尔假若是静态变量,全局变量, __block修饰的变量,block获取的是指针。
谈起这就得说一下这几个 __block修饰符了,正常情形下block内部是不容许改正部分变量的值的,可是能够改进静态变量和全局变量,为啥?下边提到了,风流倜傥种是赢得值,朝气蓬勃种是获取指针,获取值的自然就不让改了,所以要求在一些变量前加个修饰符 __block:

__block int b = 7;
void(^block)() = ^{
    b = 20;
};

如此那般block获取的正是指针了,也就能够改善了。

2.1 Block做为参数

Block作为参数大家应该不素不相识,因为最常用的三方库AFN就选拔了这种办法。这里就不贴AFN的源码了,直接仿写三个例子,当然,具体内容并不曾兑现,只是写了一个思路。

- (void)requestWith:(NSString *)url
               with:(void(^)(id dataSource))success
               with:(void(^)(NSError *error))failure
{
    if (success) {
        success(@"你获取的数据");
    }
    if (failure) {
        failure([NSError new]);// 报错信息
    }
}

//调用
[self requestWith:@"url" with:^(id dataSource) {
    //请求成功
} with:^(NSError *error) {
    //请求失败
}];
1.1 无参数无再次回到值的block
void(^blockName)();//声明
blockName = ^(){
    NSLog(@"调用");
};//实现
blockName();//调用

//当然也可以连一起写,看个人喜好
//void(^blockName)() = ^(){
//    NSLog(@"调用");
//};

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 oc