swift - 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 中声明一个变量并在下一行给它赋值是完全没问题的,只要你在赋值之前不引用那个变量。
let a: Int
... // you can't use "a" here
a = 10 // OK!
查看变量声明后的 switch 语句。switch 语句必须是详尽无遗的,这意味着它至少会运行一个 case。在这个 switch 语句中,每个 case 都有一个分配给 的语句image
,并且没有fallthrough
s。从这些观察中,我们和编译器都可以得出结论,image
将在 switch 语句之后分配(并且仅分配一次),因此您可以在行中使用它:
let annotation = BusinessMapViewModel(coordinate: coordinate,
name: name,
rating: rating, image: image)
推荐阅读
- python - 在 Python Dataframe 中的列中搜索帐号
- powershell - 使用 Out-File 以正确的格式将变量写入 CSV 文件?
- webpack - 在文件中总结 webpack 配置的命令?
- types - 当我检查它们是否相同时,如何将(?)一个`dyn SomeInterface`转换为一个通用的`T`?
- python - 如何从第一个字母中获取文件夹名称
- antlr4 - 在antlr中使用方括号解析sql
- utf-8 - IBM API Connect - 如何使 API 仅接受 UTF-8 格式的请求
- code-analysis - 如何将自定义分析器添加到我的 C# .NET 5 项目?
- javascript - 为什么我的待办事项列表复选框功能不适用于使用 DOM 添加的元素?
- python - Azure pyodbc.Error: ('01000', "[01000][unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : 找不到文件 (0) (SQLDriverConnect)