Swift 当我把这个let封装在if语句中时,为什么Xcode会抱怨?

Swift 当我把这个let封装在if语句中时,为什么Xcode会抱怨?,swift,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

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

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 url包装在一个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抱怨说,
URLSession.shared.dataTask(with:url){(data,response,error)


我不知道为什么它会抱怨这个更改。我在第一次加载这个视图时使用相同的if/else逻辑else where打印状态消息,所以我知道变量是正确的。

您的
url
声明在
if
else if
范围内失效。您需要先声明
url
,然后修改y它。此外,由于
devModeStatus
是一个布尔值,因此永远不会达到else情况,因此不需要第三条路径。请按以下方式更新代码:

let url: URL

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

您的
url
声明在那些
if
else 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")!
}

let url=url(字符串:devModeStatus?“https://otherexample.com/Example2Data.json" : "http://example.com/ExampleData.json”)
。这给了我一个初始化错误,但是@maddy的方法工作得很好。谢谢你们两位!
让url=url(字符串:devModeStatus?“https://otherexample.com/Example2Data.json" : "http://example.com/ExampleData.json”)
。这给了我一个初始化错误,但是@maddy的方法工作得很好。谢谢你们!