目前iOS开发有两种语言,Objective-c 和Swift。在Objective-c中,block的使用非常频繁,在开发中占据了很重要的位置。 Closures,通常被称作闭包,同样是Swift语言中很重要的一个部分。其功能类似Objective-c中的block。
先回顾一下block的用法:
通常来说,block的作用是保存一段代码,在需要的时候去执行。
一,声明
block的语法格式为:
returnType(^blockName)(parameterTypes)
返回值类型(^Block的名字)(参数)
block 的声明方式和普通对象一致,有使用@property定义和直接定义两种方式;
@property (nonatomic, copy) void(^myBlock)(void);
void(^myBlock)();
在方法内部使用直接声明的,可以直接在声明的时候进行定义:如:
void(^myBlock)() = ^(void){
NSLog(@"123");
};
二、使用
Block 在使用过程中,有多种形式。分别为 无参数 无返回值、有参数 无返回值, 和 有参数 有返回值 这几种。下面分别列举一下:
1、无参数 无返回值
[self postData:^{
//下载完成
}];
- (void)postData:(void(^)())finished{
finished();//下载完成
}
2、 有参数,无返回值
[self newLoadData:^(NSData *data) {
NSLog(@"%@",data);
}];
- (void)loadData:(void(^)(NSData *data))finished{
NSData *data = [[NSData alloc]initWithBase64EncodedString:@"123456" options:NSDataBase64DecodingIgnoreUnknownCharacters];
finished(data);
}
3、有参数,有返回值
int s = sunBlobck(1,2);
int(^sunBlobck)(int,int) = ^(int a, int b){
return a+b;
};
在Swift中,Closures(闭包)的作用和block类似,也是用来保存代码块,延缓执行,保证执行顺序的。
一、声明
闭包的格式为:
(parameterTypes)->(returnType) in
(形参列表) -> (返回值) in
二,使用
对比上文的Bolck,这里的闭包也按照 无参数 无返回值、有参数 无返回值, 和 有参数 有返回值 这几种进行介绍。
1、无参数 无返回值
//函数定义
func loadData(finished:() -> ()){
finished()//下载完成
}
//调用方法
1、将闭包作为函数的一个实参【swift3.0之前 闭包作为一个参数,可以省略finished:闭包名,但在3.0是会报错的。】
loadData (finished:{ ()->() in
print("下载完成")
})
/*
另外无参数无返回值 的 可以省略 ()->() in
loadData (finished: {
print("下载完成")
})
*/
2、如果闭包是函数的最后一个参数,闭包可以写在函数()的 后面,此时没有函数名finished:
loadData() { ()->() in
print("下载完成")
}
同样无参数无返回值 的 可以省略 ()->() in
loadData() {
print("下载完成")
}
或者:
loadData {
print("下载完成")
}
2、 有参数,无返回值
func loadResultData(finished:(Data) -> ()) ->(){
let data = "123456".data(using: String.Encoding.utf8)
if data != nil {
finished(data!)
}
}
//调用
loadResultData { (data) in
print(data)
}
3、有参数,有返回值
let sum = {
(a:Int,b:Int)->(Int) in
return a + b
}
print(sum(2,3))//5
以上就是Objective-c中的block 和Swift中 Closures 的简单介绍以及对比。这些只是基础,同block一样,Closures也有很多高级用法。需要学习的还有很多。
书山有路勤为径,学海无涯苦作舟。