swift中閉包類似于oc中的Block語句塊
一、一個最簡單的閉包實(shí)現(xiàn)
??1
let test = { ()->void in
print("這是一個閉包")
}
閉包就是寫好的一段代碼,然后在某一處調(diào)用,其調(diào)用方法跟oc中調(diào)用block一樣
test() //閉包調(diào)用 打印出 這是一個閉包
??()
中是參數(shù)的傳入口懂版,void
表示返回值為空 in
是分隔閉包的聲明部分和實(shí)現(xiàn)部分,即是區(qū)分()->void
和print("這是一個閉包")
這兩個部分
如果參數(shù)和返回值都為空的話??1也可以寫成??的形式
let test = {
print("這是一個閉包")
}
二档玻、帶有參數(shù)和返回值的閉包
??2
let demo = { (num1 x:Int,num2 y:Int)-> Int in
return x+y
}
let sum = demo(num1: 10, num2: 20)
print(sum)
//輸出結(jié)果為30
??這段閉包有參數(shù)名和返回值怀泊,其功能與函數(shù)相同,那么如果我們用函數(shù)來實(shí)現(xiàn)的話误趴,應(yīng)該如何書寫呢霹琼?
func demo (num1 x:Int ,num2 y:Int)->Int{
return x+y
}
let demoFunc = demo
let sum = demoFunc(num1: 30, num2: 50)
print(sum)
//輸出結(jié)果為80
對比一下閉包和函數(shù)的書寫格式可以出閉包的特點(diǎn)在于
in
的使用,其他基本相似
閉包的補(bǔ)充
聲明一個閉包
var demo:((num1:Int ,num2:Int)->Int)
//將閉包功能實(shí)現(xiàn)
demo={(num1:Int,num2:Int)->Int in
return num1+num2
}
另一種寫法,不用聲明參數(shù)類型
demo = {(num1,num2)->Int in
return num1+num2
}
第三種寫法
demo = {
return $0+$1
}
//其中$0表示第一個參數(shù),$1表示第二個參數(shù)
第四種寫法
demo = {
$0+$1
}
這三種返回值都是一樣的
三枣申、閉包與函數(shù)的結(jié)合使用(實(shí)例演練)
實(shí)現(xiàn)如下功能售葡,在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.實(shí)例化scrollView
let sv = UIScrollView()
sv.frame = frame
sv.backgroundColor = UIColor.grayColor()
//2.確定lable有幾個
let num = num()
//3.創(chuàng)建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
}
仔細(xì)閱讀會發(fā)現(xiàn),若是不考慮label
重用的話忠藤,其實(shí)現(xiàn)原理與UITableView
的代理方法是一樣的挟伙,即告訴我有幾個label
,返回幾個label
實(shí)例模孩,添加到scrollview
中尖阔。