2015-08-05 2 views
2

Это, вероятно, очень простой вопрос ...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, кажется, не является быстрым способом ее выполнения.

Приведенный выше код откажется от компиляции с ошибкой «переменная», используемой для инициализации ». (Конечно, от этого потока программы, вы можете увидеть, что url всегда будут инициализированы, но Swift, видимо, ничего не принимает как сами собой разумеющиеся.)

Не определяя переменный вне результатов if блока в неизвестной ошибке идентификатора - это, кажется, переменные определенные внутри блока if, ограничены только внутри этого блока.

Недостаточно просто определить пустой объект NSURL, есть ли лучший способ сделать это?

Желательно, чтобы я действительно использовал let, потому что объект NSURL никогда не изменится после его создания - и Swift обычно рекомендует использовать let, где это возможно. Однако, как бы вы использовали let в этом сценарии? (Я попробовал - возникают те же самые типы ошибок. Swift недоволен тем, что я фактически не объявляю сам объект в той же строке, что и оператор let, но с использованием let внутри блока if результат возникает в области.)

+0

Удаление 'var' перед' url = NSURL (string: fullUrl); 'должен делать трюк, нет? Голосование закрывается как опечатка. – dasblinkenlight

ответ

0

Вы обновляете свою собственность каждый раз, когда пытаетесь ее установить. Попробуйте:

url = /*stuff here*/;

внутри вашей, если заявления вместо:

var url = /*stuff here*/;

0

Вы должны определить за пределами {}, который устанавливает это объем. В вашем коде вы переопределяете URL-адрес в if и else, вам нужно удалить повторную декларацию «var», чтобы вы могли присвоить свой url URL-адресу из области оператора if/else.

Вы можете использовать другой, если заявление, чтобы проверить ноль и разворачивать его, если он не ноль, как

if url != nil { 

    let req = NSURLRequest(URL: url!) 
} 
5

Проблема вы переосмысление url в 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); 
+0

Да, 'var' превращает его в новое объявление вместо назначения. –

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); 
Смежные вопросы