这可能是一个非常简单的问题......
这里我有一些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
阻止导致范围问题。)
答案 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);