在范围内仍然可以使用/访问在本地范围之外声明的变量。因此,我想如果我重新声明范围内的变量,编译器会告诉我重新声明错误。
在下面的代码片段中,常量tipPercentage
在if范围之外声明,并在if范围内设置
let totallBill = 95.00
let tipPercentage: Double
let rating = 3
if rating == 5 {
tipPercentage = 0.25
} else if rating >= 3 {
tipPercentage = 0.15
} else {
let tipPercentage = 0.10 //# error caused by the let
}
let totalPaid = totallBill + totallBill * tipPercentage
问题
我在if范围内重新声明了常量。我认为它会告诉 redeclare变量错误,但相反,它会发出" constant "tipPercentage" used before being initialized.
" 为什么?
非常感谢
答案 0 :(得分:6)
那里有两个问题:
为什么你没有得到一些“重新声明”错误?
这是因为如果您在同一范围内重新声明变量,则只会出现重新声明错误。但是你的else
子句是一个更窄的范围,因此let tipPercentage
定义了另一个常量,其名称恰好与原始tipPercentage
相同,但其范围仅限于{{1} }。clause。
我原本应该预料到,这个新的窄范围else
常数已被宣布但从未使用过。
为什么在初始化之前使用“常量'tipPercentage'”错误?
你得到了这个,因为第三个子句(最后的tipPercentage
子句)定义了一个新的局部常量,巧合地称为else
,但在第三个路径中没有触及原始的tipPercentage
。因此,警告告诉您上述tipPercentage
- if
语句中存在执行路径,但未设置原始else
。
为了帮助澄清,您的代码段相当于:
tipPercentage
答案 1 :(得分:4)
重新声明内部范围中的常量不是错误。它只是将常量隐藏在外部范围内,这是完全合法的。
问题的发生是因为有一个代码路径,即通过带有重新声明的else路径,使外部保持未初始化状态。这是编译器报告的错误。