Swift 中代理的详细讲解和使用

本文深入解析Swift中的代理模式,通过具体实例展示如何在ViewController中实现并调用代理方法,包括代理声明、使用及避免循环引用的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

    代理是一种设计模式。它允许类(或者Swift中结构体)将自身负责的功能委托给其他的类型的实例示例。

应用

接下来举一个列子

  1. 代理实现的VC
import UIKit

class ViewController: UIViewController,SecondVCDelegate{
   
    @IBOutlet weak var showNameL: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func nextBtnAction(_ sender: Any) {
        let nextVC : SecondVC = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "nextVC") as! SecondVC
        nextVC.delegate = self
        self.present(nextVC, animated: true, completion: nil)
        
    }
    
    @objc func saveName(_ nameStr: String) {
        self.showNameL.text = "请输入姓名:\(nameStr)"
        print("---------------------\(nameStr)")
    }
    
    
}

在这里插入图片描述

  1. SecondVC
import UIKit

class SecondVC: UIViewController {
    weak var delegate : SecondVCDelegate?
    @IBOutlet weak var inputName: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func btnSureAction(_ sender: Any) {
        if self.delegate != nil && (self.delegate?.responds(to: Selector.init(("saveName:"))))!{
            self.delegate?.saveName(inputName.text!)
        }
        
        self.dismiss(animated: true, completion: nil)
    }
    
}

protocol SecondVCDelegate : NSObjectProtocol {
    func saveName(_ nameStr : String)
}

在这里插入图片描述

Swift中Delegate细节注意

一、需要用weak修饰代理(weak var SecondVCDelegate?)

weak修饰声明的属性避免循环引用的问题(类似OC中的weak修饰)

二、代理方法的判断(respondsToSelector()在Swift中的使用)

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

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

Swift Delegate详解的: Demo地址
https://github.com/FlameDream/Delegate_Test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值