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
运行良好。
好的,我有一个 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
运行良好。