<iOS>enumerateKeysAndObjectsUsingBlock的用法

来源:互联网 发布:java有哪些小游戏 编辑:程序博客网 时间:2024/05/16 06:29

enumerateKeysAndObjectsUsingBlock的用法

block是一个有序的指令代码块,通常在代码中间花括号括起来的objective-c代码,但是它能被传递或被分配局部变量,然后作为一个参数来传递,基本上可以把花括号中间的代码保存到数据结构里。看起来就像这样子:

[aDictionary enumrateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop){

    NSLog(@“value for key %@ is %@”,key,value); 

    if([@“ENOUGH” isEqualToString:key]){*stop = YES;}

}];

NSDictionary有一个方法叫enumerateKeysAndObjectsUsingBlock,它就一个参数就是block,这个block携带了三个参数,这将要把dictionary里面的key和value每次一组传递到block,enumerateKeysAndObjectsUsingBlock会遍历dictionary并把里面的key和value一组一组的展示给你,每组都会执行这个block。这其实就是传递一个block到另一个方法,在这个例子里面它会带着特定参数被反复调用,直到找到一个ENOUGH的key,然后就会通过重新赋值那个BOOL *stop来停止运行,停止遍历同时停止调用block。


^表示这是一个block。在enumerateKeysAndObjectsUsingBlock之前定义一个局部变量,可以在block里面使用,但它们都是只读的。

BOOL stoppedEarly = NO;

double stopValue = 53.5;

[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {

 NSLog(@“value for key %@ is %@”, key, value); 

if ([@“ENOUGH” isEqualToString:key] || ([value doubleValue] == stopValue)) { *stop = YES; stoppedEarly = YES; // 不合法的 }

}]; 


不过如果你在前面加上__block,就会变成可读写了,然后在block执行完成后它会保留被赋的值

__block BOOL stoppedEarly = NO; 

double stopValue = 53.5;

[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {

 NSLog(@“value for key %@ is %@”, key, value); 

if ([@“ENOUGH” isEqualToString:key] || ([value doubleValue] == stopValue)) { *stop = YES; stoppedEarly = YES; // 合法的 }

}]; 

if(stoppedEarly)NSLog(@“I stopped logging dictionary values early!”);

在block里面用了一个实例变量,出来后也是有效的,而且不是只读的。


typedef一个block:

typedef double(^unary_operation_t)(double op);

这行代码是定义一个新类型,它本质上是一个block,它接受一个类型为double参数,返回值的类型也是double的,新类型的名字叫unary_operation_t。

已经定义好了这个类型,现在用它声明一个变量,变量名叫square,接下来给它赋值:

unary_operation_t square;

square = ^(double operand){//the value of the square variable is a block return operand *operand}

现在有了一个类型为unary_opration_t的变量square,怎么用?就像用一个C语言函数一样:

double squareOfFive = square(5.0);

把5.0作为参数传给block,5.0就是block里面的操作数,它进行平方操作,得到25。


下面一行代码可以不用typedef直接声明square:

double(^square)(double op) = ^(double op){return op *op;}

此处的square是一个变量,而不是一个类型。

一旦定义好unary_operation_t,这种类型实际上是一个block,就可以用它进行函数声明了,把它作为函数的参数,就是声明一个参数为unary_operation_t类型的方法,比如addUnaryOperation:whichExecutesBlock:,第二个参数是block,可以用unary_operation_t来声明这个方法。首先,加入一个property:

@property (nonatomic, strong) NSMutableDictionary *unaryOperations;

它就是一个用来存储所有unaryOperations的dictionary,用来记录key值的dictionary。

然后实现addUnaryOperation:whichExecutesBlock:

typedef double (^unary_operation_t)(double op);

- (void)addUnaryOperation:(NSString *)op whichExecutesBlock: (unary_operation_t)opBlock {

    [self.unaryOperations setObject:opBlock forKey:op];

} 

这个方法的第二个参数是一个block,unary_operation_t指明了block的类型。把block看成一个对象,通过给定的key加入到dictionary里。block用起来像类一样,实际不是,只是有些类似,不能给它传递消息,可以像安置id一样安置它们。

ARC负责block的内存管理,由于它本身并不是一个对象,它靠ARC进行内存管理,当block执行完之后,它的内存是自动释放的。

然后就有了一个字典,字典的key是代表操作的字符串,值是block。接着可以这么做:

- (double)performOperation:(NSString *)operation{ 

unary_operation_t unaryOp = [self.unaryOperations objectForKey:operation]; 

if (unaryOp) { self.operand = unaryOp(self.operand); } . . .}

大多数不用typedef声明一个方法,比如:

- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block; 

没有返回值,所以是void,注意(^),在括号中间没有其他东西,是因为没有定义type,后面就是block需要的参数,然后就是block。

block很常见,实际上有简便方法,然后有两件事情需要去做:第一,不必去声明那些能被block里面引用的type,如果它能够在block里被推断出来,比如:

NSNumber *secret = [NSNumber numberWithDouble:42.0];

[brain addUnaryOperation:@“MoLtUaE” whichExecutesBlock:^(double operand) { return operand * [secret doubleValue];}]; 

另外一个就是如果一个block没有参数的话,不必写这个(),比如

[UIView animateWithDuration:5.0 animations:^{ view.opacity = 0.5;}]; 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝账户被限制登录怎么办 美团退款申诉失败怎么办 微信申诉不回来怎么办 特岗登录名忘记了怎么办 天猫账号被限制怎么办 微信双开被限制登录怎么办 云服务显出账号已过期怎么办 全国对讲机显示账号过期怎么办 淘宝账号身份证过期了怎么办 清理垃圾软件打打不开怎么办 电脑清理后软件打不开了怎么办 手机黑屏开不了机怎么办 红米手机wifi打不开怎么办 苹果8开不开机怎么办 mac电脑打不开机怎么办 steam改密码上限了怎么办 qq加密了登不了怎么办 别人登我的淘宝怎么办 植物2被禁止登录怎么办 淘宝网东西未收到怎么办 淘宝网卖家不许退货退款怎么办 身份证以前开过淘宝店怎么办 支付宝登录名尚未激活怎么办 淘宝退货卖家不收货退款买家怎么办 淘宝账号刷得太多违规怎么办 闲鱼交易关闭了怎么办 淘宝店开了没做怎么办 微店店铺严重违规怎么办 淘宝违规扣2分怎么办 淘宝被扣6分怎么办 淘宝被扣2分怎么办 淘宝被海关扣了怎么办 淘宝被扣36分后怎么办 淘宝售假查封店铺资金怎么办 淘宝店扣48分怎么办 淘宝a内被扣48分怎么办 饿了么店铺满减怎么办 淘宝店扣a48分怎么办 淘宝短信营销无法获取人群怎么办 淘宝货发了退款怎么办 极速退款后卖家不确认收货怎么办