Как получить 2 несвязанных объекта Swift, чтобы знать, как выполнять одинаковые наборы функций - PullRequest
0 голосов
/ 06 июня 2018

Прежде чем кто-то скажет наследование ... выслушай меня первым.

У меня есть 2 совершенно не связанных контроллера представления.У каждого из них есть MKMapView.Я хотел бы, чтобы они оба соответствовали и реализовывали одни и те же методы делегата.

Например, я хочу, чтобы оба реализовали:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let polyline = overlay as! MKPolyline
        let renderer = MKPolylineRenderer(polyline: polyline)
        renderer.strokeColor = UIColor.red
        renderer.lineWidth = 4
        return renderer
    }

Опять же, эти 2 контроллера представления не связанывообще, поэтому я не хочу делать базовый класс.Фактически, эти 2 контроллера представления уже наследуют от своей соответствующей иерархии наследования.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Одним из решений может быть:

protocol CommonStuff {
   func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer 
}

extension CommonStuff where Self: UIViewController {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let polyline = overlay as! MKPolyline
        let renderer = MKPolylineRenderer(polyline: polyline)
        renderer.strokeColor = UIColor.red
        renderer.lineWidth = 4
        return renderer
    }
}

Тогда принятие протокола обоими контроллерами представления обеспечит им одинаковое поведение.

0 голосов
/ 06 июня 2018

Используйте протокол и реализацию по умолчанию.

protocol SomeMapFunctions {
    var mapView : MKMapView? { get }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
}

extension SomeMapFunctions {
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let polyline = overlay as! MKPolyline
        let renderer = MKPolylineRenderer(polyline: polyline)
        renderer.strokeColor = UIColor.red
        renderer.lineWidth = 4
        return renderer
    }
}

class VC1 : UIViewController, SomeMapFunctions {
    var mapView : MKMapView?
}

class VC2 : UIViewController, SomeMapFunctions {
    var mapView : MKMapView?
}

Как показано, любые общие свойства, необходимые для реализаций по умолчанию, также могут быть включены в протокол.

...