Swift 4.0學習之:閉包

閉包

說到閉包,用法跟OC的block是一樣一樣的,基本格式是 { ()->() in }
通常是放到函數的實參裏,舉一個實際應用的例子:
目標:創建一個scrollorView,上面有10個按鈕,要求有一定的可複用性,可維護性,可擴展性。代碼如下:
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
//然後在閉包裏直接寫 self 就可以了
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章