Реализация расширения класса в SwiftUI без переноса класса UIKit - PullRequest
0 голосов
/ 03 апреля 2020

Я попробовал несколько репозиториев GitHub, чтобы добавить стили к моему Apple MapKit, и в каждом из их указаний говорится о расширении класса ViewController: MKMapViewDelegate, как показано ниже. Я понимаю, что структура не может быть расширена как класс UIKit.

extension ViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if let tileOverlay = overlay as? MKTileOverlay {
            return MKTileOverlayRenderer(tileOverlay: tileOverlay)
        }
        return MKOverlayRenderer(overlay: overlay)
    }

}

У меня нет проблем с реализацией этого в UIKit, но я пытаюсь понять, как SwiftUI будет интегрирован, если я не хочу обернуть что-нибудь классом UIKit.

Возможно ли обойти это расширение, поддерживая мой SwiftUI, не оборачивающий класс UIKit? Я хотел бы понять, как реализовать это для будущих проблем, так как многие GitHub-репозитории следуют аналогичным инструкциям, которые расширяют некоторые классы, но не подходят для использования с SwiftUI.

В дальнейших попытках у меня есть класс-координатор I попытался добавить функцию в мой класс координатора, который расширил MKMapViewDelegate.

class Coordinator: NSObject, MKMapViewDelegate {

    let mapView = MKMapView()

    init(mapView: MKMapView) {
        super.init()
        mapView.delegate = self

        addCustomOverlay()


    }

    private func addCustomOverlay() {
        guard let jsonURL = Bundle.main.url(forResource: "overlay", withExtension: "json") else { return }

        do {
            let gmTileOverlay = try GoogleMapsTileOverlay(jsonURL: jsonURL)
            gmTileOverlay.canReplaceMapContent = true
            mapView.addOverlay(gmTileOverlay)
        } catch let error {
            print(error.localizedDescription)
        }
    }

Неудивительно, что удалось изменить текущий стиль координатора местоположения, но не тайлы mapView.

1 Ответ

1 голос
/ 03 апреля 2020

Возможно ли обойти это расширение, поддерживая, чтобы мой SwiftUI не переносил класс UIKit?

Вы не можете сделать это без , упаковывающего класс UIKit поскольку MKMapView само по себе является UIView, поэтому для использования его в SwiftUI вы ДОЛЖНЫ обернуть его в UIViewRepresentable, который явно предоставляется Apple для таких случаев.

На самом деле для меня не ясно, причина такого самоограничения ... SwiftUI & UIKit не враги - они живут вместе.

...