最终实例效果
Swift闭包的作用和OC中的block一致
1、保存代码
2、做耗时操作
<br />
1、闭包
定义闭包的方式
/*
{
() -> ()
in
code....
}
第一个括号代表:参数
第二个括号代表:返回值
in 用来表示这是一个闭包,表示in后面的就是要执行的代码
*/
<br />
写法
// 写法一
let block = {
() -> ()
in
print("write Method One")
}
//下面这行表示调用
block()
// 写法二
//如果在没有参数,没有返回值的情况下,in之前,包括in都可以省略不写
let block2 = {
print("write Method One")
}
//下面这行表示调用
block2()
<br />
闭包作为函数的参数的写法
<br />
1、 没有参数,没有返回值
blockOne {
print("没有参数,没有返回值")
}
func blockOne(block: () -> ()){
//调用下面的遇见,才会执行闭包内的代码
block()
}
<br />
2、 没有参数,有返回值
blockTwo { () -> String in
return "我是返回的参数"
}
func blockTwo(block:() -> String){
print(block())
}
<br />
3、 有参数,没有返回值
blockThree { (name) in
print(name)
}
func blockThree(block :(name : String) -> ()){
block(name: "我的名字叫小明")
}
<br />
3、 有参数,有返回值
blockFour { (a, b) -> Int in
return a + b
}
func blockFour(block :(a : Int, b : Int) -> Int ){
print(block(a: 5, b: 6))
}
<br />
闭包作为属性的写法
<br />
1、直接写
//没有参数,没有返回值
var bibao1 : (() -> ())?
//没有参数,有返回值
var bibao2 : (() -> String)?
//有参数,没返回值
var bibao3 : ((age : Int) -> ())?
//有参数,有返回值
var bibao4 : ((a : Int , b : Int) -> Int)?
<br />
2、写法二
typealias imBlock = (view : UIView) -> ()
var im = imBlock?()
<br /><br />
实例:使用闭包创建一个ScrollView,并添加东西
此方法可复用,以后创建ScrollView便可直接使用
func createScrollView (frame : CGRect,item : () -> Int , view : (num : Int) -> UIView) -> UIScrollView{
//定义ScrollView
let sc = UIScrollView(frame: frame)
//设置背景颜色
sc.backgroundColor = UIColor.purpleColor()
//通过一个没有参数有返回值的block来得知要创建多少个View
let count = item()
//遍历
for index in 0...(count - 1) {
//通过一个有参数有并且返回值为View的block把返回值添加到ScrollView中
sc.addSubview(view(num: index))
}
//通过获取ScrollView的子控件,得到他的宽度,用来计算contentSize
let subView = sc.subviews.last
//如果获取到子控件是空,直接返回scrollView
if subView == nil {
return sc
}
//设置contentSize
sc.contentSize = CGSize(width: (subView?.frame.width)! + (subView?.frame.origin.x)!, height:(subView?.frame.height)!)
//返回ScrollView
return sc
}
<br />
调用方法
//实例
let sc = createScrollView(CGRect(x: 0, y: 100, width: view.frame.width, height: 100), item: { () -> Int in
//返回要创建的个数
return 20
}) { (num) -> UIView in
//返回每一个View
let imageView = UIImageView(frame: CGRect(x: num * 90 , y: 10, width: 80, height: 80))
imageView.image = UIImage(named: "000.png")
return imageView
}
view.addSubview(sc)
<br />