三元条件运算符的警告仅发生在局部范围
Warning for ternary conditional operator only occurs at local scope
我使用以下 Swift 代码根据单位值设置密钥字符串:
let units = 0
let key = units == 0 ? "F" : "C"
// this example makes key = "F"
上面的示例在 Swift 文件的全局范围内正常工作,没有警告。但是,当我将相同的代码放入初始值设定项或函数中时,我收到一条关于 "C" 项的警告:
struct Almanac {
// properties
}
extension Almanac {
init?(json: [String: Any]) {
let units = 0
let key = units == 0 ? "F" : "C" // WARNING: Will never be executed
// ...
}
}
func logunits() {
let units = 0
let key = units == 0 ? "F" : "C" // WARNING: Will never be executed
print("key is \(key)")
}
为什么只有在局部范围内使用三元条件时才会出现此警告?
这与范围有关,因为在某些给定的范围内,编译器能够解析这个简单的表达式,并发现某些部分不会被执行。
有了这个:
func logunits() {
let units = 0
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
编译器在同一范围内有 units = 0
和 units == 0 ?
,因此它能够解析路径(因为两行之间没有任何改变 units
的值)和告诉你,是的,确实,单位是 0 是的,"C" 将永远被忽略。
如果更改值:
func logunits() {
let units = 1
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
警告突然从"C"跳到"F"。 :)
如果您将值放在范围之外:
let units = 0
func logunits() {
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
警告消失。
请注意,如果路径中有任何代码可以更改 units
的值,即使是像本例中这样的愚蠢代码,警告也会消失:
func logunits() {
var units = 0
if true { units = 1 }
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
我使用以下 Swift 代码根据单位值设置密钥字符串:
let units = 0
let key = units == 0 ? "F" : "C"
// this example makes key = "F"
上面的示例在 Swift 文件的全局范围内正常工作,没有警告。但是,当我将相同的代码放入初始值设定项或函数中时,我收到一条关于 "C" 项的警告:
struct Almanac {
// properties
}
extension Almanac {
init?(json: [String: Any]) {
let units = 0
let key = units == 0 ? "F" : "C" // WARNING: Will never be executed
// ...
}
}
func logunits() {
let units = 0
let key = units == 0 ? "F" : "C" // WARNING: Will never be executed
print("key is \(key)")
}
为什么只有在局部范围内使用三元条件时才会出现此警告?
这与范围有关,因为在某些给定的范围内,编译器能够解析这个简单的表达式,并发现某些部分不会被执行。
有了这个:
func logunits() {
let units = 0
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
编译器在同一范围内有 units = 0
和 units == 0 ?
,因此它能够解析路径(因为两行之间没有任何改变 units
的值)和告诉你,是的,确实,单位是 0 是的,"C" 将永远被忽略。
如果更改值:
func logunits() {
let units = 1
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
警告突然从"C"跳到"F"。 :)
如果您将值放在范围之外:
let units = 0
func logunits() {
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}
警告消失。
请注意,如果路径中有任何代码可以更改 units
的值,即使是像本例中这样的愚蠢代码,警告也会消失:
func logunits() {
var units = 0
if true { units = 1 }
let key = units == 0 ? "F" : "C"
print("key is \(key)")
}