swift5.x 属性、代理、block、通知传值
2019-12-24 本文已影响0人
Bruce_XHG
1、属性传值:
属性传值和我们使用oc的时候是一样的,比如我们常用的跳转的时候进行的属性传值
let vc = ALCourseListDetailRootViewController()
vc.type = 1
self.navigationController.pushViewController(vc, animated: true)
在属性传值的时候我们还会经常使用到,重写属性的set方法,达到刷新数据的目的
var _studentListArr: [ALCourseClassStudentsItemModel] = []
var studentListArr:[ALCourseClassStudentsItemModel] {
get{
return _studentListArr
}
set{
_studentListArr = newValue
self.tableView.reloadData()
}
}
说实在的swift的重写set方法比oc麻烦多了
2、代理传值:
代理传值也是和oc是一样的,也是语法上有些区别
声明代理
protocol ALCourseListDetailLeftViewDelegate: NSObjectProtocol {
func ALCourseListDetailLeftViewClick(item: Any, index:Int)
func ALCourseListDetailLeftViewCellClick(item: ALCourseClassStudentsItemModel)
func ALCourseListDetailLeftGroupAllClick()
}
weak var delegate:ALCourseListDetailLeftViewDelegate?
然后在需要传值的地方调用
self.delegate?.ALCourseListDetailLeftViewCellClick(item: itemModel)
在所需要的文件里面遵循代理,实现代理的方法就OK了
3、block传值:
block的使用和oc也是一样的,但是语法上需要注意,以及swift对block的声明
typealias requestSuccessDataBlock = (_ objc:Any,_ headerRefresh:Bool) -> Void
var requestSuccessDataBlock: requestSuccessDataBlock!
if self?.requestSuccessDataBlock != nil {
self?.requestSuccessDataBlock(self?.dataArr as Any, true)
}
viewModel.requestSuccessDataBlock = {[weak self] (objc: Any, headerRefresh:Bool) -> Void in
if (objc as! NSArray).count > 0 {
if headerRefresh == true {
self?.learnContentView.dataArr = NSMutableArray(array: objc as! NSArray)
}else{
let temp = self?.learnContentView.dataArr
temp!.addObjects(from: (objc as! NSArray) as! [Any])
self?.learnContentView.dataArr = temp!
}
}
}
4、通知:
我们都知道通知也是可以传值的
NotificationCenter.default.post(name: Notification.Name(rawValue: "notoceName"), object: self, userInfo: ["model":model.learnM as LearningFileItemModel])
NotificationCenter.default.addObserver(self, selector: #selector(textDidChange), name: "notoceName", object: self)
@objc func textDidChange(notification: Notification) {
if let sender = notification.object {
}
}