gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:56:54 28 4
gpt4 key购买 nike

在局部作用域外声明的变量在作用域内仍然可用/可访问。因此,我想如果我在范围内重新声明变量,编译器会告诉我重新声明错误。

在以下代码片段中,常量 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 范围内重新声明了常量。我以为它会告诉一个重新声明变量错误,但相反,它给出了初始化前使用的“常量“tipPercentage”。为什么强>?

enter image description here

非常感谢

最佳答案

这里有两个问题:

  1. 为什么没有出现“重新声明”错误?

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

    不过,我本以为会收到另一个警告,指出这个新的窄范围 tipPercentage 常量已声明但从未使用过。

  2. 为什么会出现“初始化前使用的常量‘tipPercentage’”错误?

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


为了帮助澄清,您的代码片段等同于:

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 foo = 0.10 // this was coincidentally called `tipPercentage`, but since this is yet another a local constant of even narrower scope, it's equivalent to using a completely different name
}

let totalPaid = totallBill + totallBill * tipPercentage

关于swift - 重新声明变量,Xcode在初始化之前就告诉它使用了,为什么不重新声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676948/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com