6.1 Constructing Block Objects

创建block对象

block 对象可以是内嵌的,也可以是独立的代码块的形式。
我们先来看下传统的OC函数是怎么写的,假设一个OC函数要接收两个NSInteger并返回他们的差值,我们这样写:
- (NSInteger) subtract:(NSInteger)paramValue
 from:(NSInteger)paramFrom{
 return paramFrom - paramValue;
}
接下来我们用纯C函数的来实现:
NSInteger subtract(NSInteger paramValue, NSInteger paramFrom){
 return paramFrom - paramValue;
}
再来看看用block怎么来实现:
NSInteger (^subtract)(NSInteger, NSInteger) =^(NSInteger paramValue, NSInteger paramFrom){
 return paramFrom - paramValue;
};

先再来多看看例子,假设一个函数要接收一个NSUInteger参数,并用字符串的形式返回,用C我们是这么写的:
NSString* intToString (NSUInteger paramInteger){
 return [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
}
用Block我们是这么写的:
NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
 NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
 return result;
};

最简单的独立的block对象当然是不接收参数返回void的形式:
void (^simpleBlock)(void) = ^{
/* Implement the block object here */
};

block对象可以像C函数一样被调用。像C函数一样传递参数或获得返回值。来个例子:
NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
};
- (void) callIntToString{
NSString *string = intToString(10);
NSLog(@"string = %@", string);
}

callIntToString 函数调用了intToString block对象,并把10传给他,然后用一个局部变量接收返回值。

好了,block对象你已经知道怎么写了是不是,接下来,我们来看下怎么把它当做一个参数传给函数。假设我们需要一个函数来接收一个整形和一个block对象,在函数内用block对象对这个整形进行处理并返回处理结果:
- (NSString *) convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramBlockObject{
 return paramBlockObject(paramInteger);
}

可是编译器怎么知道你这个block可以接收整形参数呢?这时你可在在函数前面先做声明:
typedef NSString* (^IntToStringConverter)(NSUInteger paramInteger);

这样我们就可以这样来调用了:
- (void) doTheConversion{
 NSString *result = [self convertIntToString:123 usingBlockObject:intToString];
 NSLog(@"result = %@", result);
}

block对象也可以直接在函数内实现:
- (void) doTheConversion{
IntToStringConverter inlineConverter = ^(NSUInteger paramInteger){
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
};
NSString *result = [self convertIntToString:123
usingBlockObject:inlineConverter];
NSLog(@"result = %@", result);
}

甚至在需要传递时才去实现:
- (void) doTheConversion{
NSString *result =
[self convertIntToString:123
usingBlockObject:^NSString *(NSUInteger paramInteger) {
NSString *result = [NSString stringWithFormat:@"%lu",
(unsigned long)paramInteger];
return result;
}];
NSLog(@"result = %@", result);
}
这是我们创建的就是内联的block 兑现(inline block object)

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值