闭包
说到闭包,用法跟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
}