我使用以下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)")
}
为什么仅在本地范围内使用三元条件时才会出现此警告?
答案 0 :(得分:0)
这与范围有关,因为在某些给定范围内,编译器能够解析该简单表达式并看到某些部分不会被执行。
有了这个:
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)")
}