swift之代理

swift之代理详解和使用
前言
代理是一种设计模式。它允许类(Swift中的结构体)将自身负责的功能委托给其他的类型的实例示例。多用于反向传值问题等
应用
反向传值应用,这个和objective_c的写法类似,如果熟悉oc的同学对此不会陌生
1.创建ViewController

class ViewController: UIViewController,SecondDelegate {

    var showLabel:UILabel?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        configUI()
    }
    
    func configUI() {
        showLabel = UILabel(frame: CGRect(x: 0, y: 100, width: 320, height: 40))
        showLabel?.textAlignment = .center
        showLabel?.text = "firstVc"
        view.addSubview(showLabel!)
        
        let pushButton = UIButton(type: .custom)
        pushButton.frame = CGRect(x: 150, y: 200, width: 60, height: 40)
        pushButton.setTitle("跳转", for: .normal)
        pushButton.backgroundColor = .systemPink
        pushButton.addTarget(self, action: #selector(pushBtnClick), for: .touchUpInside)
        view.addSubview(pushButton)
        
    }
    
    @objc func pushBtnClick() {
        let svc = SecondViewController()
        svc.delegate = self
        self.navigationController?.pushViewController(svc, animated: true)
    }
    
    @objc func saveName(_ nameStr: String) {
        showLabel?.text = nameStr
    }
}

2.secondViewController

protocol SecondDelegate:NSObjectProtocol {
    func saveName(_ nameStr: String)
}
class SecondViewController: UIViewController {

    weak var delegate: SecondDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        if self.delegate != nil && (self.delegate?.responds(to: Selector.init(("saveName:"))))! {
            self.delegate?.saveName("secondVc")
        }
    }
}

Swift中Delegate细节注意
一、需要用weak修饰代理(weak var SecondDelegate?)
weak修饰声明的属性避免循环引用的问题(类似OC中的weak修饰)

二、代理方法的判断(respondsToSelector()在Swift中的使用)
原因是在OC的代码中, 用respondsToSelector()方法来判断是否实现了方法。
而在Swift中需要使用 (self.delegate?.responds(to: Selector.init((“saveName:”))))! 的方式判断是否实现这个方法。

在在代理执行的类中需要使用@objc 修饰saveName方法。(***@objc*** 关键字来达到,Objective-C中使用#selector中使用)

block后面的文章会讲到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值