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

时间:2016-10-08 15:36:11

标签: swift struct initialization conditional-operator

我使用以下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)")
}

为什么仅在本地范围内使用三元条件时才会出现此警告?

1 个答案:

答案 0 :(得分:0)

这与范围有关,因为在某些给定范围内,编译器能够解析该简单表达式并看到某些部分不会被执行。

有了这个:

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)")
}