前言
????代理是一種設(shè)計(jì)模式。它允許類(lèi)(或者Swift中結(jié)構(gòu)體)將自身負(fù)責(zé)的功能委托給其他的類(lèi)型的實(shí)例示例。
應(yīng)用
接下來(lái)舉一個(gè)列子
- 代理實(shí)現(xiàn)的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 = "請(qǐng)輸入姓名:\(nameStr)"
print("---------------------\(nameStr)")
}
}
在這里插入圖片描述
- 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細(xì)節(jié)注意
一、需要用weak修飾代理(weak var SecondVCDelegate?)
weak修飾聲明的屬性避免循環(huán)引用的問(wèn)題(類(lèi)似OC中的weak修飾)
二、代理方法的判斷(respondsToSelector()在Swift中的使用)
原因是在OC的代碼中, 用respondsToSelector()方法來(lái)判斷是否實(shí)現(xiàn)了方法。
而在Swift中需要使用 (self.delegate?.responds(to: Selector.init(("saveName:"))))! 的方式判斷是否實(shí)現(xiàn)這個(gè)方法。
在在代理執(zhí)行的類(lèi)中需要使用@objc 修飾saveName方法。(@objc 關(guān)鍵字來(lái)達(dá)到,Objective-C中使用#selector中使用)
Swift Delegate詳解的: Demo地址
https://github.com/FlameDream/Delegate_Test