ios - Swift - 另一个协议中协议函数的默认实现
问题描述
以下代码只是一个示例:我需要MapProtocol
在我的 ViewController 类中实现。ViewController 本身有一个类型为 的变量MKMapView
。但是在我的情况下,MKMapViewDelegate
需要通过协议的扩展来实现,并且不能通过 ViewController 类来实现,但这不起作用。根本不会调用委托函数(仅当由 ViewController 实现时)
我是否错过了在另一个协议中为协议添加默认实现的快速限制?如果是,是否有适当的解决方法?
真实案例:我有两个 ViewController,它们共享一些冗余代码(MKMapViewDelegate 等)。所以我想外包这段代码。我不能使用超类,因为两个视图控制器已经是两种不同类型的子类。我的第一种方法是使用扩展协议。
import UIKit
import MapKit
class ViewController: UIViewController, MapProtocol {
var mapView: MKMapView = MKMapView()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupMapView()
}
private func setupMapView() {
self.view.addSubview(mapView)
mapView.mapType = MKMapType.standard
mapView.isZoomEnabled = true
mapView.isScrollEnabled = true
mapView.delegate = self
mapView.translatesAutoresizingMaskIntoConstraints = false
mapView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
mapView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true
mapView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true
mapView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0).isActive = true
}
}
/** Works if uncommented */
//extension ViewController: MKMapViewDelegate {
// func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
// NSLog("test")
// }
//}
protocol MapProtocol: MKMapViewDelegate {
var mapView: MKMapView { set get }
}
extension MapProtocol {
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
NSLog("test")
}
}
解决方案
这有点奇怪,但我认为委托的调度查找不会在协议添加时“看到”委托方法。协议扩展是静态绑定的,而不是动态查找方案的一部分。
推荐阅读
- sql - Apex 升级 5.1 - 19.1,可能会破坏什么?
- python - 使用 for 函数通过列表挖掘列表
- python - 用python求解具有大指数的方程
- ruby-on-rails - 在 HTML POST 之后 Rails 偶尔会冻结 - 极长的活动记录时间
- php - 更改值时如何使用onchange自动更新mysql
- php - 获取从日期到月底 PHP 的秒数
- android - Android Studio GeoDataClient 和 PlaceDetectionClient 无法解析
- postgresql - PostgreSQL 10 逻辑复制触发功能未执行
- r - 在 R 循环中格式化多个 CSV 文件
- c - 在 C 中打印 3 个带边框的板