Swift-更改常量不会显示错误

时间:2019-08-20 01:06:52

标签: 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)
    }
  }
}

2 个答案:

答案 0 :(得分:2)

首先,您应该知道在Swift中声明一个变量并在下一行为其分配值是完全可以的,只要您在分配变量之前不引用该变量即可。

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

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

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

答案 1 :(得分:2)

从Swift 5.1参考资料中,here

  

在函数或方法的上下文中出现常量声明时,只要可以保证在第一次读取其值之前已设置了值,就可以稍后对其进行初始化。