2016-11-08 3 views
1

Я хочу вернуть currData, который является типом wData (нестандартный тип). currData объявлен в начале функции и будет установлен в do-catch блоке:Пытается обновить переменную в блоке do-catch, которая будет возвращена: фатальная ошибка: неожиданно обнаружена нуль при развертывании Необязательное значение

func getWData(stnID: Int) -> wData{ 
    var currData: wData? 

    let parameters: Parameters = ["id": String(stnID), "accesstype": "w"] 

    Alamofire.request("https://myurl.tld", parameters: parameters).response { response in 
     print("Request: \(response.request)") 
     print("Response: \(response.response)") 
     print("Error: \(response.data)") 

     if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
      print("Data: \(utf8Text)") 

      let dArr = utf8Text.components(separatedBy: "~") 
      do { 
       try currData = wData(hash: Int(dArr[0])!, stnName: String(dArr[1])!) 
      } catch { 
       print("error creating wData Object: \(error)") 
      } 

     } 
    } 

    return currData! 
} 

Но когда я пытаюсь вернуть currData объект Я получаю следующее сообщение об ошибке:

fatal error: unexpectedly found nil while unwrapping an Optional value

Мой wData класс выглядит следующим образом:

class wData{ 
    var hash: Int 
    var stnName: String 

    init(hash: Int, stnName: String) { 
     self.hash  = hash 
     self.stnName = stnName 
    } 
} 

Я думал, что я мог бы создать статическую переменную в моем классе:

class wData{ 

    static var currDObj: wData? 
    var hash: Int 
    var stnName: String 

    init(hash: Int, stnName: String) { 
     self.hash  = hash 
     self.stnName = stnName 

     currDObj = self 
    } 
} 

А потом вернуть currDObj в моей функции getWData с:

return weatherData.currData! 

Но она по-прежнему дает мне ошибку. Что я сделал неправильно?

+0

Какое значение DARR [0] и DARR [1] – zombie

+1

Вы не можете вернуть значение из функции, что делает асинхронный вызов , – rmaddy

ответ

1

Эта строка try currData = wData(hash: Int(dArr[0])!, stnName: String(dArr[1])!), скорее всего, не будет оценена до этой строки return currData!, так что currData по-прежнему равна нулю. Вам нужно использовать закрытие с вашей функцией, а не возвращать значение.

Что-то вроде этого: (также повышение безопасности ноль)

func getWData(stnID: Int, completion: (wData?) ->()) { 

    let parameters: Parameters = ["id": String(stnID), "accesstype": "w"] 

    Alamofire.request("https://myurl.tld", parameters: parameters).response { response in 
     print("Request: \(response.request)") 
     print("Response: \(response.response)") 
     print("Error: \(response.data)") 

     if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
      print("Data: \(utf8Text)") 

      let dArr = utf8Text.components(separatedBy: "~") 
      guard let hash = Int(dArr[0]), stnName = String(dArr[1]) else { 
       completion(nil) 
       return 
      } 
      do { 
       let currData: wData = try wData(hash: hash, stnName: stnName) 
       completion(currData) 

      } catch { 
       print("error creating wData Object: \(error)") 
       completion(nil) 
      } 

     } 
     else { 
      completion(nil) 
     } 
    } 
} 
+0

, в то время как я согласен, что он будет терпеть неудачу из-за того, что он является асинхронным, но разве он не терпит неудачу. * Если * попытка не работает ... приводит к тому, что currData является nil и сбой? – Honey

+0

@rmaddy Я не ОП :). Но я имел в виду исходный код из OP. Может включать это в ваш ответ – Honey

+0

@Honey Затем вы должны высказать свой вопрос на вопрос, а не этот ответ. Я удалю свои комментарии после того, как вы удалите свои и опубликуете их правильно. – rmaddy