Swift3.0 函数闭包与OC Block
刚接触Swift,如有不对,欢迎指正
- Swift中定义一个基本函数
//定义一个函数,接收一个字符串,返回一个String类型的值
func test(name:String) -> String { return ("输出了\(name)")
}
//通用形式
func name(parameters) -> return type {
function body
}
- Swift 中基本的闭包函数与OC中Block的相似点

- 带参闭包
//OC中Block是这样
void (^test) (NSString *)=^(NSString *name){ NSLog(@"%@",name); }; test(@"测试");
//对应到swift的带参闭包 let test={(_ name:String)->() in // in 后面就是回调之后处理的函数 ,相当于是Block之后的{ }
print(name) } test("测试") //通用形式
{
(parameters) -> returnType in
code
} 这里下划线 _ 的作用用来忽略外部參数名,具体可以参考这篇文章http://www.cnblogs.com/bhlsheji/p/4746072.html
- OC中带Block参数的函数定义
-(void)loadData:( void(^)(void) )completetion
{
completetion();
}
- Swift中带闭包参数的函数定义
func loadData(completetion: ()->()) -> () {
completetion()
}
//样式 func: ()->()
- 举个比较常用的例子,网络数据获取
//OC中Block传值
-(void)loadData:( void(^)(NSArray *) )completetion
{ //这里暂时先忽略掉线程,简单处理,重点在swift闭包
NSLog(@"耗时操作"); sleep();//模拟网络请求 NSArray *arr=@[@"",@""]; NSLog(@"主线程回调"); completetion(arr); //返回获得的数据 } 调用:
[self loadData:^(NSArray *callBack){ NSLog(@"%@,%@",callBack[],callBack[]); }]; 输出:
-- ::45.273 tessst[:] 耗时操作
-- ::47.345 tessst[:] 主线程更新
-- ::47.346 tessst[:] , //swift中闭包传值
func loadDate(completion: @escaping (_ result : [String])->()) -> () { //这里有一个很重要的参数 @escaping,逃逸闭包
//简单来说就是 闭包在这个函数结束前内被调用,就是非逃逸闭包,调用的地方超过了这函数的范围,叫逃逸闭包
//一般网络请求都是请求后一段时间这个闭包才执行,所以都是逃逸闭包。
// 在Swift3.0中所有的闭包都默认为非逃逸闭包,所以需要用@escaping来修饰
DispatchQueue.global().async { print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: )
let json=["",""] DispatchQueue.main.async {
print("主线程更新\(Thread.current)") completion(json)
//函数在执行完后俩秒,主线程才回调数据,超过了函数的范围,这里就是属于逃逸闭包,如果不用@escaping,编译器是编译不过的
}
}
} 主函数调用loadDate:
loadDate { (callBack) in
print("\(callBack)")
} 输出值
耗时操作<NSThread: 0x608000069140>{number = , name = main}
主线程更新<NSThread: 0x608000069140>{number = , name = main}
1,2
- 在Block中经常会有循环引用的情况,闭包中也一样,常用的解决方式有俩种
//第一种
weak var weakwelf=self
//套用oc的方式(__weak typedef(weakself)=self).
//这里要注意,不能用 let ,因为self可能会释放指向nil,相当于是一个可变值 //调可选项发送消息的时候 用 ? 解包 不用 ! pringt("weakself ?.view") 不用" weakself!.view"
//因为强制解包一旦weakself=nil时会崩溃 //第二种,在调用时候
//[weak self]标识在{}中所有的self都是弱引用
loadDate { [weak self] in
print(self?.view)
}
- 尾随闭包
尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。可以使用尾随闭包来增强函数的可读性。
func someFunctionThatTakesAClosure(closure: () -> ()) {
// 函数体部分
}
// 以下是不使用尾随闭包进行函数调用
someFunctionThatTakesAClosure({
// 闭包主体部分
})
// 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
// 闭包主体部分
}
续更...
Swift3.0 函数闭包与OC Block的更多相关文章
- Swift3.0 函数闭包与 Block
刚接触Swift,如有不对,欢迎指正 Swift中定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> Strin ...
- python学习-42 装饰器 --- 函数闭包1
函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...
- 闭包和OC的block的本质
“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域). http://blog.csdn ...
- 7 函数——《Swift3.0从入门到出家
6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...
- 4 .Swift函数|闭包
在编程中,我们常把能完成某一特定功能的一组代码,并且带有名字标记类型叫做函数,在C语言中,我们知道函数名就是一个指针,它指向了函数体内代码区的第一行代码的地址,在swift中也具有同样的功效. 在Sw ...
- Swift函数|闭包
在编程中,我们常把能完成某一特定功能的一组代码,并且带有名字标记类型叫做函数,在C语言中,我们知道函数名就是一个指针,它指向了函数体内代码区的第一行代码的地址,在swift中也具有同样的功效. 在Sw ...
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- Swift2.3 --> Swift3.0 的变化
Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...
- Swift3.0语言教程查找字符集和子字符串
Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...
随机推荐
- Hadoop权威指南: InputFormat,RecordReader,OutputFormat和RecordWriter
InputFormat和RecordReader Hadoop提出了InputFormat的概念 org.apache.hadoop.mapreduce包里的InputFormat抽象类提供了如下列代 ...
- Hadoop权威指南:从Hadoop URL读取数据
[TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
奇怪的慢sql 我们先来看2条sql 第一条: select * from acct_trans_log WHERE acct_id = 1000000000009000757 order b ...
- QML Object Attributes QML对象属性
QML Object Attributes Every QML object type has a defined set of attributes. Each instance of an obj ...
- linux下读取系统内存的demo
#include <stdio.h> #define KIBIBYTE_SIZE 1024LL #define MEBIBYTE_SIZE 1048576LL #define GIBIBY ...
- java的位运算符
1.与运算&,同为1为1,否则为0: 例如:10001(二进制)&10000(二进制)=10000(二进制) 2.或运算|,只要有1就是1: 例如:10001(二进制)&100 ...
- Swift 2.0 UIAlertView 和 UIActionSheet 的使用
在 IOS 9.0 之后, UIAlertView 是 给废弃了的,虽然你要使用的话,暂时还是可以的,但是在 9.0 之后,IOS 推荐大家使用的是 UIAlertController 这个控制器 ...
- python面向对象编程对象和实例的理解
给你一个眼神,自己体会
- 【安装eclipse, 配置java环境教程】 编写第一个java程序
写java通常用eclipse编写,还有一款编辑器比较流行叫IJ.这里我们只说下eclipse编写java的前期工作. 在安装eclipse之前要下载java的sdk文件,即java SE:否则无法运 ...
- Python爬虫爬取qq视频等动态网页全代码
环境:py3.4.4 32位 需要插件:selenium BeautifulSoup xlwt # coding = utf-8 from selenium import webdriverfrom ...
