2015-08-11 5 views
0

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

Когда я пишу «self.resultLabel.text = погода» в конце, Xcode показывает мне использовать ошибки «погоды» неразрешенного идентификатора

Я знаю, как это исправить. Мне нужно инициировать «погоду» сразу после запуска метода задачи и установить его в «», а затем я должен изменить его значение в функции, но даже если я этого не сделаю, и я создам его в закрытии if, не должен Я смогу достичь этого, находясь в одной и той же функции?

Я не понимаю, почему это заставляет меня давать эту ошибку.

func findWeather() { 

     var errorStatus = false 

     city = (cityField.text?.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()))! 

     let url = NSURL(string: "http://www.weather-forecast.com/locations/" + city.stringByReplacingOccurrencesOfString(" ", withString: "-") + "/forecasts/latest")! 

     let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in 

      if let content = data { 

       let urlContent = NSString(data: content, encoding: NSUTF8StringEncoding) as NSString! 
       let weatherContent = urlContent.componentsSeparatedByString("<span class=\"phrase\">") 
       if weatherContent.count > 1 { 

        let weather = weatherContent[1].componentsSeparatedByString("</span>")[0].stringByReplacingOccurrencesOfString("&deg;", withString: "˚") 


       } else { 

        var weather = "" 
        errorStatus = true 

       } 


      } else { 

       var weather = "" 
       errorStatus = true 

      } 


      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       if errorStatus == true { 

        self.showError() 

       } else { 

        self.resultLabel.text = weather // I get error: use of unresolved identifier 'weather' 

       } 

      }) 

     } 

     task?.resume() 
+0

Move 'вар погода = ""', чтобы перед 'если let'. Это совершенно верно. –

ответ

1

Вы определяете слишком много новых переменных weather, которые все видимые только локально между фигурными скобками они находятся в.

Лучшее место, чтобы определить weather находится в начале task закрытия и все var или let объявления последующих вхождения переменной должны быть удалены.

Здесь ключевой части:

let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in 

    var weather = "" 
    if let content = data { 
     let urlContent = NSString(data: content, encoding: NSUTF8StringEncoding) as NSString! 
     let weatherContent = urlContent.componentsSeparatedByString("<span class=\"phrase\">") 
     if weatherContent.count > 1 { 
     weather = weatherContent[1].componentsSeparatedByString("</span>")[0].stringByReplacingOccurrencesOfString("&deg;", withString: "˚") 
     } else { 
     errorStatus = true 
     } 
    } else { 
     errorStatus = true 
    } 

... 
Смежные вопросы