Swift:定义一个变量然后有条件地设置它?

时间:2015-08-05 16:07:25

标签: swift

这可能是一个非常简单的问题......

这里我有一些Swift代码:

var url: NSURL
if (someValue > 1) {
    var fullUrl = self.baseUrl + "?id=" + (someValue as! String);
    var url = NSURL(string: fullUrl);
}
else {
    var url = NSURL(string: self.baseUrl);
}
let req = NSURLRequest(URL: url);
webView.loadRequest(req);

如您所见,我需要有条件地初始化url变量。但是,我在几乎所有其他强类型语言中使用的方法 - 初始化变量然后在if语句中赋值给它 - 似乎不是Swiftly的做法。

上面的代码将拒绝编译错误“变量'url'用于初始化”错误。 (当然,从这个程序流程中,您可以看到url总是被初始化,但Swift显然没有理所当然。)

未在if块之外定义变量会导致未知标识符错误 - 似乎if块内定义的变量仅限于该块内的范围。

如果没有定义一个空的NSURL对象,还有更好的方法吗?

最好我真的想在此使用let因为NSURL对象在创建后永远不会改变 - 并且Swift倾向于建议尽可能使用let。但是,在这种情况下,您将如何使用let? (我试过了 - 发生了相同类型的错误.Swift不满意我实际上并没有在let语句的同一行声明对象本身,而是在{{1}内使用let阻止导致范围问题。)

4 个答案:

答案 0 :(得分:5)

问题是您在var url = NSURL(string: self.baseUrl);的上下文中将if-else重新定义为url,因此let外部永远不会被设置。

这样可以解决错误,并允许您将url用于let url: NSURL if (someValue > 1) { var fullUrl = self.baseUrl + "?id=" + (someValue as! String); url = NSURL(string: fullUrl); } else { url = NSURL(string: self.baseUrl); } let req = NSURLRequest(URL: url); webView.loadRequest(req);

{{1}}

答案 1 :(得分:0)

每次尝试设置时,都会重新声明属性。尝试:

url = /*stuff here*/;

在if语句中而不是:

var url = /*stuff here*/;

答案 2 :(得分:0)

您必须在{}之外定义,以设置其范围。在您的代码中,您要在if和else中重新定义url,您需要删除“var”的重新声明,以便您可以将url分配给if / else语句范围之外的url。

你可以使用另一个if语句来检查nil并解开它,如果它不是nil,比如

if url != nil {

    let req = NSURLRequest(URL: url!)
}

答案 3 :(得分:0)

你的变量url需要有条件做这样的事情。

var url: NSURL?
if (someValue > 1) {
   var fullUrl = self.baseUrl + "?id=" + (someValue as! String);
   url = NSURL(string: fullUrl);
}
else {
   url = NSURL(string: self.baseUrl);
}
let req = NSURLRequest(URL: url);
webView.loadRequest(req);