ios - 扩展如何与 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")
.
解决方案
在这种情况下,您正在扩展当前类以使其符合协议。通过遵守协议,该类现在可以访问协议签名声明的所有功能。
你看不到函数被调用的原因是因为你的类只是作为一个委托人。换句话说,这些方法是从您的班级执行指令的另一个班级调用的。
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
推荐阅读
- button - 文件名作为 PowerBI 中的度量
- mongodb - 用猫鼬更新文档——一个属性没有被更新?
- android - 将 apk 集成到 AOSP 的构建系统中并在启动时运行它
- python - TensorFlow py_function 设置返回值形状
- mysql - 更新并选择具有非唯一标识符的 FIFO 队列中的 MySQL 表
- r - Shiny App 未使用 dplyr 和 %in% 运算符进行过滤
- blockchain - Chainlink 消费者合约中回调地址的用途是什么?
- google-analytics - 无法在 Google Analytics(分析)中配置目标
- javascript - React 钩子形式 - 对话框内的字段数组(材料 UI)
- r - Rollapply 或类似的时间序列数据中的多条件阈值