我正在从书中阅读教程。我不能把这本书附在这里。在章节中,声明了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)
}
}
}
答案 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
在函数或方法的上下文中出现常量声明时,只要可以保证在第一次读取其值之前已设置了值,就可以稍后对其进行初始化。