在没有函数调用可见的程序中,什么时候调用 swift 函数?

When are swift functions called in programs where no function call is visible?

The example below 取自 Mapbox,展示了如何使用注释在地图上标记位置。我知道 viewDidLoad 在应用程序启动时被调用,这就是在 viewDidLoad 函数中运行所有内容的原因。

我不明白这个程序中的最后两个函数是怎么调用的(这两个函数的名字好像都是mapView)。我在 viewDidLoad

中看不到对它们的引用
import Mapbox

class ViewController: UIViewController, MGLMapViewDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()

    let mapView = MGLMapView(frame: view.bounds)
    mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Set the map’s center coordinate and zoom level.
    mapView.setCenter(CLLocationCoordinate2D(latitude: 40.7326808, longitude: -73.9843407), zoomLevel: 12, animated: false)
    view.addSubview(mapView)

    // Set the delegate property of our map view to `self` after instantiating it.
    mapView.delegate = self

    // Declare the marker `hello` and set its coordinates, title, and subtitle.
    let hello = MGLPointAnnotation()
    hello.coordinate = CLLocationCoordinate2D(latitude: 40.7326808, longitude: -73.9843407)
    hello.title = "Hello world!"
    hello.subtitle = "Welcome to my marker"

    // Add marker `hello` to the map.
    mapView.addAnnotation(hello)
  }

  // Use the default marker. See also: our view annotation or custom marker examples.
  func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
    return nil
  }

  // Allow callout view to appear when an annotation is tapped.
  func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
    return true
  }
}

这个

mapView.delegate = self

class ViewController: UIViewController, MGLMapViewDelegate {

负责调用它们,在 MapKit 框架中 class MKMapView 有一个委托 属性 当你设置正确的委托时内部发生这种情况

delegate?.mapView(self,//)

你也不应该return nil here

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {

这些是由名为 MGLMapViewDelegate 的协议声明的委托方法,它已实现到您的 class

class ViewController: UIViewController, MGLMapViewDelegate { ... }

通过将某个对象的 delegate 设置为您的控制器 (= self),就像您在 viewDidLoad

中对 MGLMapView 所做的那样
mapView.delegate = self

你是说当在 mapView 的委托上调用某些方法时,你已经实现的方法如 mapView(_:viewFor:) -> MGLAnnotationView? 将被调用。


无论如何,你的 mapView 应该是实例变量,否则你失去了对它的引用

class ViewController: UIViewController, MGLMapViewDelegate {

    var mapView: MGLMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView = MGLMapView(frame: view.bounds)
        ...
    }
}

它们是委托函数,不是您调用的普通函数,更像是根据操作调用的函数,并且您确实将 MapView.delegate 设置为 self 所以当函数被调用时在 MapView 关于调用他们的案例中,他们将回到你的 self 中的实施方,在这种情况下 UIViewController,我建议阅读更多关于代表 here,如此快捷的回答,函数不是在同一个 class 中调用的。