首页 > 解决方案 > 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")
    }
}

标签: iosswiftprotocols

解决方案


这有点奇怪,但我认为委托的调度查找不会在协议添加时“看到”委托方法。协议扩展是静态绑定的,而不是动态查找方案的一部分。


推荐阅读