首页 > 解决方案 > Swift - 更改常量不会显示错误

问题描述

我正在读一本书的教程。我不能在这里附上这本书。在一个章节中,一个UIImage常量被声明并且它的值在下一行被赋值。它不是一个var既不optional。它运行成功。它是如何工作的?

extension ViewController: MKMapViewDelegate {         
  private func addAnnotations() {
    for business in businesses {
      guard let yelpCoordinate = business.location.coordinate else {
        continue
      }

      let coordinate = CLLocationCoordinate2D(latitude: yelpCoordinate.latitude,
                                              longitude: yelpCoordinate.longitude)
      let name = business.name
      let rating = business.rating
      let image:UIImage //Constant non-optional
      switch rating {
      case 0.0..<3.5:
        image = UIImage(named: "bad")!
      case 3.5..<4.0:
        image = UIImage(named: "meh")!
      case 4.0..<4.75:
        image = UIImage(named: "good")!
      case 4.75..<5.0:
        image = UIImage(named: "great")!
      default:
        image = UIImage(named: "bad")!
      }
      let annotation = BusinessMapViewModel(coordinate: coordinate,
                              name: name,
                              rating: rating, image: image)
      mapView.addAnnotation(annotation)
    }
  }
}

标签: swift

解决方案


首先,你应该知道在 Swift 中声明一个变量并在下一行给它赋值是完全没问题的,只要你在赋值之前不引用那个变量。

let a: Int
... // you can't use "a" here
a = 10 // OK!

查看变量声明后的 switch 语句。switch 语句必须是详尽无遗的,这意味着它至少会运行一个 case。在这个 switch 语句中,每个 case 都有一个分配给 的语句image,并且没有fallthroughs。从这些观察中,我们和编译器都可以得出结论,image将在 switch 语句之后分配(并且仅分配一次),因此您可以在行中使用它:

let annotation = BusinessMapViewModel(coordinate: coordinate,
                              name: name,
                              rating: rating, image: image)

推荐阅读