guard let 正在执行,但它之后的代码仍然有效?

Guard let is executing, but the code after it still works?

好的,我有一个 MapKit 应用程序,并且刚刚完成了 MKAnnotationView 的设置。我的 MKAnnotationView class 看起来像这样:

class JumpSpotAnnotationView: MKMarkerAnnotationView {

override var annotation: MKAnnotation? {
    willSet {
        // Extra safe, making sure there's no errors
        guard (newValue as? JumpSpotAnnotation) != nil else {
            print("The JumpSpotAnnotation or JumpSpotAnnotationView has something wrong if you are reading this. (JumpSpotAnnotationView)")
            return
        }
        // Setting up UI for the little Callout bubble that appears when you tap the annotation to see more info
        canShowCallout = true
        calloutOffset = CGPoint(x: 0, y: 0)
        rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        //detailCalloutAccessoryView
        markerTintColor = .blue
    }
}
}

我的视图控制器中的 mapView viewFor 函数如下所示:

extension ViewController: MKMapViewDelegate {

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    
    // Make sure the annotation entering the screen is a JumpSpotAnnotation, and exists
    guard let annotation = annotation as? JumpSpotAnnotation else {
        print("The JumpSpotAnnotation or JumpSpotAnnotationView has something wrong if you are reading this. (mapView viewFor func)")
        return nil
    }
    // Downcast the dequeued view as a JumpSpotAnnotationView, and make sure it has the same identifier as the registered JumpSpotAnnotationView above in viewDidLoad
    let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: "JumpSpotAnnotation") as? JumpSpotAnnotationView
    dequeuedView?.annotation = annotation
    // Return annotation views here
    return dequeuedView
}

}

老实说,我把 guard let's 放在每一个中,因为我看到其他人这样做并认为它会更安全。我不太确定它们的目的是什么,除了确保注释确实进入了视图,并且是我指定的正确类型的注释(我认为它至少做到了)。

无论如何,当我通过在我的应用程序中按下一个按钮来实际添加注释时,一切都完美无缺,正如我想要的那样,但是 guard let's 内部的打印语句显示在调试器中。我不知道是什么导致了它们,也不知道为什么我的代码在它们被触发后仍然有效,当 guard let's 已经执行的事实应该停止它们下面的代码执行,并弄乱我的应用程序时。任何人都可以提供想法或解释吗?我应该补充一点,应用程序加载后,来自 mapView viewFor func 的打印语句出现一次,然后,每次我添加注释时,来自 JumpSpotAnnotationView 的打印语句出现。

我想确保我没有遗漏一些我会后悔的大错误。

有一些 MKAnnotations 在 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 工作时不是 JumpSpotAnnotation 的 class。它必须来自 MKMapView 所以不用担心。您的 guard let 运行良好。