一:闭包的表达式
//闭包就是函数,是一种有特定格式的函数。常用于保存一段代码,用作回调,处理耗时操作等等
//闭包格式如下
//{ (参数) -> 返回值类型 in 执行的语句 }
//in是用来区分形参,返回值和执行代码
//调用函数
myname("sgc") { () -> () in
print("执行回调")
}
//也可以这样调用
myname("sgc",{ () -> () in
print("执行回调")
})
//闭包作为参数
func myname(name: String, finished: () -> ()){
print(" my name = \(name)")//执行耗时操作
finished()
}
/*闭包简写:
1.如果没有参数, 没有返回值, in和in之前的东西可以省略
2.如果闭包是函数的最后一个参数, 可以写在()后面 -- 尾随闭包
3.如果只有一个闭包参数, 那么()也可以省略 -- 尾随闭包
4.闭包写在参数列表中
*/
二:闭包返回值
//调用createScrollView函数
let sc = createScrollView({ () -> Int in
return 15
}) { (index) -> UILabel in
let width = 50
let label = UILabel()
label.backgroundColor = UIColor.greenColor()
label.textColor = UIColor.darkGrayColor()
label.font = UIFont.systemFontOfSize(17)
label.text = "text\(index)"
label.frame = CGRect(x: index * width, y: 0, width: width, height: 44)
return label
}
view.addSubview(sc)
}
//创建两个闭包参数,用来返回ScrollView的数量,和ScrollView上子view的类型
func createScrollView(labelCount: ()->Int, viewWithIndex: (index:Int)->UILabel) -> UIScrollView{
// 1.创建UIScrollView
let sc = UIScrollView(frame: CGRect(x: 0, y: 100, width: 375, height: 44))
let count = labelCount()//闭包返回的子view个数
// 2.遍历创建UILabel
for i in 0..<count{
let label = viewWithIndex(index: i)//闭包返回的子view
sc.addSubview(label)
sc.contentSize = CGSize(width: CGFloat(count) * label.bounds.width, height: 44)
}
// 返回UIScrollView
return sc
}
三:循环引用的问题
参照这篇文章: http://www.cocoachina.com/ios/20160224/15349.html