閉包
說到閉包,用法跟OC的block是一樣一樣的,基本格式是 { ()->() in }
通常是放到函數的實參裏,舉一個實際應用的例子:
override func viewDidLoad() {
super.viewDidLoad()
let sc = creatScrollorView(creatNumber: { () -> Int in
return 10
}) { (index) -> UIView in
let btn = UIButton()
btn.setTitle("\(index)", for: .normal)
btn.backgroundColor = UIColor.yellow
btn.frame = CGRect.init(x: index * width, y: 0, width: width, height: 50)
return btn
}
//在Swift中,能不用self儘量不用self,self一般只在閉包中使用
view.addSubview(sc)
}
func creatScrollorView(creatNumber:() -> Int, viewIndex:(Int) -> UIView) -> UIScrollView {
let sc = UIScrollView.init(frame: CGRect.init(x: 0, y: 100, width: UIScreen.main.bounds.width, height: 100))
let count = creatNumber()
for i in 0..<count {
let subView = viewIndex(i)
sc.addSubview(subView)
sc.contentSize = CGSize.init(width: subView.bounds.width * CGFloat
}
return sc
}
上面說到閉包和OC的block用法一樣,那麼當類的對象持有閉包,閉包的代碼塊裏持有類的對象的時候,必然也會出現循環引用導致對象無法被釋放的問題。
在OC中,我們用一個弱指針去持有一個對象,然後在block的代碼塊裏用這個弱指針去解決這個問題,代碼如下:
__weak __typeof(&*self)weakSelf = self;
Swift其實也一樣,寫的更簡單一點而已
weak var weakSelf = self
如果是在閉包裏用的話,Swift還有種更簡單的寫法
{ [weak self] () in
}