当我在if语句中包装let时,为什么Xcode会抱怨?

时间:2019-01-13 22:20:15

标签: swift

我的应用程序中包含以下工作代码:

func downloadJSON(completed: @escaping ([JsonFile.JsonBonuses]?) -> ()) {
        let url = URL(string: "http://example.com/ExampleData.json")!
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error == nil, let data = data {
                do {
                    let posts = try JSONDecoder().decode(JsonFile.self, from: data)
                    completed(posts.bonuses)
                    self.defaults.set(posts.meta.version, forKey: "jsonVersion")
                    print("URLSession did not fail")
                    print("JSON Version Set to \(posts.meta.version)")
                } catch {
                    print("Can't decode JSON: \(error)")
                }
            } else {
                print("downloadJSON completed")
                completed(nil)
            }
        }.resume()
    }

我想根据UserDefaults设置将该URL更改为其他URL。因此,我将let网址包装在一个if语句中,如下所示:

if devModeStatus == true {
            let url = URL(string: "https://otherexample.com/Example2Data.json")!
        } else if devModeStatus == false {
            let url = URL(string: "http://example.com/ExampleData.json")!
        } else {
            print("Invalid Dev Status encountered!")
            return
        }

但是,当我这样做时,Xcode抱怨“使用未解析的标识符'url';您是指'erfl'吗?”在显示URLSession.shared.dataTask(with: url) { (data, response, error) in

的行上

我不确定为什么要抱怨这一变化。我在第一次加载此视图时使用相同的if / else逻辑在其他位置打印状态消息,因此我知道该变量是正确的。

1 个答案:

答案 0 :(得分:3)

您的url声明在这些ifelse-if范围内死亡。您需要先声明url,然后再进行修改。另外,由于devModeStatus是布尔值,所以永远不会达到else情况,因此不需要第三条路径。如下更新代码:

let url: URL

if devModeStatus {
    url = URL(string: "https://otherexample.com/Example2Data.json")!
} else {
    url = URL(string: "http://example.com/ExampleData.json")!
}