首页 > 解决方案 > 扩展如何与 Swift 中的类一起工作?

问题描述

我是 Swift 新手,有两个问题:

我试图了解这个扩展正在做什么的高级图片:


    class WeatherViewController: UIViewController {

        var weatherManager = WeatherManager()
        let locationManager = CLLocationManager()

        @IBOutlet weak var conditionImageView: UIImageView!
        @IBOutlet weak var temperatureLabel: UILabel!
        @IBOutlet weak var cityLabel: UILabel!
        @IBOutlet weak var searchTextField: UITextField!

        override func viewDidLoad() {
            super.viewDidLoad()

            locationManager.delegate = self
            locationManager.requestWhenInUseAuthorization()
            locationManager.requestLocation()

            searchTextField.delegate = self
            weatherManager.delegate = self
        }

    }

    extension WeatherViewController: CLLocationManagerDelegate {
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            print("Got location data")
        }

        func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
            print(error)
        }
    }

据我了解,扩展的功能之一是修改或添加到预先存在的类或构造。例如,如果我想重新定义 Double 类:

    extension Double {
        func round(to places: Int) -> Double {
            let precisionNumber = pow(10, Double(places))
            var n = self
            n = n * precisionNumber
            n.round()
            n = n / precisionNumber
            return n
        }
    }

因此,当我创建一个extension WeatherViewController: CLLocationManagerDelegate如上所示的扩展时,我在修改或添加到WeatherViewController使用CLLocationManagerDelegate协议调用的预先存在的类时基本上是在做同样的事情吗?

我猜想CCLocationManager已经有一个方法被调用locationManager,我正在向它添加我自己的定义,或者连接到它以使用它的功能,但不确定这是否是正确的思维方式

其次,当我调用一个函数并传递参数时,我通常是在函数被调用的时候传递参数:

    func myFunc(param: param: String) {
       // something
    }
    myFunc("someParameter")

我没有看到我的扩展程序中的位置管理器函数在哪里被调用,并且参数在任何地方被显式传递。但是,我仍然能够得到print("Got location data").

标签: iosswift

解决方案


在这种情况下,您正在扩展当前类以使其符合协议。通过遵守协议,该类现在可以访问协议签名声明的所有功能。

你看不到函数被调用的原因是因为你的类只是作为一个委托人。换句话说,这些方法是从您的班级执行指令的另一个班级调用的。

https://learnappmaking.com/delegation-swift-how-to/

有关扩展的更多信息:https ://docs.swift.org/swift-book/LanguageGuide/Extensions.html

有关协议的更多信息:https ://docs.swift.org/swift-book/LanguageGuide/Protocols.html


推荐阅读