swift中闭包类似于oc中的Block语句块
一、一个最简单的闭包实现
🌰1
let test = { ()->void in
print("这是一个闭包")
}
闭包就是写好的一段代码,然后在某一处调用,其调用方法跟oc中调用block一样
test() //闭包调用 打印出 这是一个闭包
👆()
中是参数的传入口,void
表示返回值为空 in
是分隔闭包的声明部分和实现部分,即是区分()->void
和print("这是一个闭包")
这两个部分
如果参数和返回值都为空的话🌰1也可以写成👇的形式
let test = {
print("这是一个闭包")
}
二、带有参数和返回值的闭包
🌰2
let demo = { (num1 x:Int,num2 y:Int)-> Int in
return x+y
}
let sum = demo(num1: 10, num2: 20)
print(sum)
//输出结果为30
👆这段闭包有参数名和返回值,其功能与函数相同,那么如果我们用函数来实现的话,应该如何书写呢?
func demo (num1 x:Int ,num2 y:Int)->Int{
return x+y
}
let demoFunc = demo
let sum = demoFunc(num1: 30, num2: 50)
print(sum)
//输出结果为80
对比一下闭包和函数的书写格式可以出闭包的特点在于
in
的使用,其他基本相似
闭包的补充
声明一个闭包
var demo:((num1:Int ,num2:Int)->Int)
//将闭包功能实现
demo={(num1:Int,num2:Int)->Int in
return num1+num2
}
另一种写法,不用声明参数类型
demo = {(num1,num2)->Int in
return num1+num2
}
第三种写法
demo = {
return $0+$1
}
//其中$0表示第一个参数,$1表示第二个参数
第四种写法
demo = {
$0+$1
}
这三种返回值都是一样的
三、闭包与函数的结合使用(实例演练)
实现如下功能,在scrollView中添加多个label
代码如下
override func viewDidLoad() {
super.viewDidLoad()
let frame = CGRect(x: 0, y: 20, width: view.bounds.width, height: 44)
let sv = scrollView(frame, num: { () -> Int in
return 16
}) { (index) -> UILabel in
let lab = UILabel()
lab.text = "lable\(index)"
lab.font = UIFont.systemFontOfSize(18)
lab.sizeToFit()
lab.font = UIFont.systemFontOfSize(14)
return lab
}
view.addSubview(sv)
}
func scrollView(frame: CGRect,num :()->Int ,lab: (index: Int)->UILabel)->UIScrollView{
//1.实例化scrollView
let sv = UIScrollView()
sv.frame = frame
sv.backgroundColor = UIColor.grayColor()
//2.确定lable有几个
let num = num()
//3.创建lable
let margin:CGFloat = 8.0
var x = margin
for i in 0..<num{
let lab = lab(index: i)
lab.frame = CGRect(x: x, y: 10, width: lab.bounds.width, height: lab.bounds.height)
sv.addSubview(lab)
x+=lab.bounds.width
}
sv.contentSize = CGSize(width: x, height: 0)
//4.返回scrollView
return sv
}
仔细阅读会发现,若是不考虑label
重用的话,其实现原理与UITableView
的代理方法是一样的,即告诉我有几个label
,返回几个label
实例,添加到scrollview
中。