代码之家  ›  专栏  ›  技术社区  ›  erotsppa

是否仍有不用于条件赋值的可选项?

  •  -1
  • erotsppa  · 技术社区  · 4 年前

    我发现自己在这种情况下

    func method() -> expensiveObj {    
    var x: expensiveObj?    //this has to be optional or compiler complains not initialized
    
        if someCondition {
          x = expensiveObj() 
        } else P {
          x = expensiveObj()
        }
    
        return x // <---this is not allowed, need to unwrap with !
    }
    

    我该如何克服?

    1 回复  |  直到 4 年前
        1
  •  2
  •   matt    4 年前

    事实上,这不是真的。这是合法的,(鲜为人知的事实)你甚至可以使用 let var :

    func method() -> String {
        let x:String
        if someCondition {
            x = "1"
        } else {
            x = "2"
        }
        return x
    }
    

    必须 涵盖你的所有可能性 if else 系列。换句话说,在任何情况下 x 未初始化。如果有这种情况,编译器会正确地阻止您。

    func method() -> String {
        let x:String
        if someCondition {
            x = "1"
        } else if anotherCondition {
            x = "2"
        }
        return x // error
    }
    

    是的,因为如果两个条件都不成立呢?你需要全力以赴:

    func method() -> String {
        let x:String
        if someCondition {
            x = "1"
        } else if anotherCondition {
            x = "2"
        } else {
            x = "3"
        }
        return x
    }