重新声明变量,Xcode告诉它在初始化之前使用,为什么不重新声明错误?

时间:2016-07-30 18:02:20

标签: swift xcode scope

在范围内仍然可以使用/访问在本地范围之外声明的变量。因此,我想如果我重新声明范围内的变量,编译器会告诉我重新声明错误。

在下面的代码片段中,常量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." 为什么

enter image description here

非常感谢

2 个答案:

答案 0 :(得分:6)

那里有两个问题:

  1. 为什么你没有得到一些“重新声明”错误?

    这是因为如果您在同一范围内重新声明变量,则只会出现重新声明错误。但是你的else子句是一个更窄的范围,因此let tipPercentage定义了另一个常量,其名称恰好与原始tipPercentage相同,但其范围仅限于{{1} }。clause。

    我原本应该预料到,这个新的窄范围else常数已被宣布但从未使用过。

  2. 为什么在初始化之前使用“常量'tipPercentage'”错误?

    你得到了这个,因为第三个子句(最后的tipPercentage子句)定义了一个新的局部常量,巧合地称为else,但在第三个路径中没有触及原始的tipPercentage。因此,警告告诉您上述tipPercentage - if语句中存在执行路径,但未设置原始else

  3. 为了帮助澄清,您的代码段相当于:

    tipPercentage

答案 1 :(得分:4)

重新声明内部范围中的常量不是错误。它只是将常量隐藏在外部范围内,这是完全合法的。

问题的发生是因为有一个代码路径,即通过带有重新声明的else路径,使外部保持未初始化状态。这是编译器报告的错误。