关于swift的delegate和protocol

谷梁博易
2023-12-01

delegate:委托,代理
类中有属性,方法,事件
delegate与事件有关
protocol:协议,与类相似,但是其中属性,方法,事件没有具体内容
当class遵守协议之后,需要实现这个协议中的某一些函数。

delegate的使用
例如在获取地址的方法里

import CoreLocation
class ViewController: UIViewController,CLLocationMangerDelegate {
//加入delegate
    let locationManager = CLLocationManager()
  //引入需要使用的方法,locationManager为CLLocationManager()的实例
    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self
        
    }

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let lat = locations[0].coordinate.latitude
        let lon = locations[0].coordinate.longitude
    }

目标:获取经度和纬度
1.使用Xcode自带的功能包CoreLocation

2.将其实例化之后进行用户授权,在info中加入描述

3.在系统提供的功能包中,如现在的CoreLocation中,要使用其中的CLLocationManager方法,需要让ViewLController遵守CLLocationManagerDelegate协议,也是要让ViewController实现这个函数。
所以在调用locationManager获取地址时候,需要让ViewController知道这个协议的代理人是VC自己,故而需要在ViewDidLoad中写入locationManager.delegate = self,从而形成一个闭环

locationManager的代理人是ViewController,亦可以说是ViewController实现了locationManager

两个页面间的传值

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "selectCity"{
            let vc = segue.destination as! SelectCityController //as!向下转型
            //if let vc = segue.destination as? SelectCityController
            vc.currentCity = weather.city//正向传值
        }
    }

用segue.destination可以得到要跳转到的Controller,segue是链接两个页面的箭头,segue.identifier用来判断要跳转去哪个页面
随着箭头指向的方向,进行正向传值。

反向传值:

//1,自定义了一个协议及里面的事件方法
protocol SelectCityDelegate {
    func didChangeCity(city:String)
}
//2,规定谁可以触发这些事件方法
    var delegate:SelectCityDelegate?
//3,在哪里触发这些事件函数呢
    @IBAction func changeCity(_ sender: Any) {
        //问号的意思:delegate有值则继续执行后面的调用,若为nil,则不执行后面的调用
        delegate?.didChangeCity(city: cityInput.text!)
        //销毁当前页面
        dismiss(animated: true, completion: nil)
    }
 类似资料: