三元条件运算符的警告仅发生在局部范围

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 = 0units == 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)")
}