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 就可以了
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章