2017-01-30 4 views
0

Я пытаюсь сделать запрос GET через Alamofire и ожидать, что данные будут возвращены. Он отлично работает, когда я инициализировать мой класс данных в моем ViewController какПопытка получить данные из запроса GET

let dataRequest = DataClass() 

, а затем вызвать мою функцию для получения данных, но когда я пытаюсь объявить его как

let dataRequest: DataClass! 

и попытаться вызвать GET функция говорит, что неожиданно найдено нуль.

Причина, по которой я разворачиваю силу, по сравнению с инициализацией, заключается в том, что в моем классе данных у меня есть функция init, такая как init (адрес: String, Zip: Double).

Я поделюсь своими занятиями, поэтому, возможно, кто-то может дать мне некоторое представление о том, почему его возвращение ноль.

class FirstViewController { 
var dataRequest: DataClass! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    dataRequest.downloadData { // Returns nil at this point 
    let initData = DataClass(dataRequest._address) 


} 

} 
} 

DATACLASS

Class DataClass { 
var _address: String! 
init(address: String) { 
_address = address 
} 
func downloadProperties(completed: @escaping downloadComplete) { 
    Alamofire.request(Listings).responseJSON { response in 
     if let result = response.result.value { 
      let dict = JSON(result) 
      if let data = dict["data"].dictionary { 

       if let listingResultDict = data["listings"]?.array { 

        for list in listingResultDict { 

         if let propertyAddress = list["data"]["name"].string { 
          self._address = propertyName 
         } 
         } 
        } 
        } 
       } 
       complete() 
      } 
      } 

    } 

Констант

typealias downloadComplete =() ->() 

Позвольте мне знать, если там должно быть больше разъяснений.

ответ

1

Вы никогда не инициализировали dataRequest в FirstViewController.

Выполнение DataClass! не инициализирует его. Он в основном сообщает компилятору, что вы гарантируете, что это значение НЕ равно нулю и не является необязательным.

Вы все еще должны дать ему начальное значение .. Вот почему, когда вы делаете:

let dataRequest = DataClass() работает (dataRequest в этом случае может быть необязательным). Вы также можете: let dataRequest: DataClass! = DataClass() сообщить компилятору, что он НЕ будет равен нулю и будет иметь начальное значение.

+0

Я могу» t вызвать DataClass без инициализации w хотя функция init все же, и данные пусты, пока я не вызову функцию downloadProperties. –

+0

@bradfordgray; То, что я предложил, будет работать. В противном случае выполните 'dataRequest = Data (...)' then do 'dataRequest.downloadData' AFTER. – Brandon

+0

Да, вы правы, мне просто нужно было добавить фиктивные данные в начальное объявление, а затем я мог бы назвать загрузку и заполнить все. Благодарю. –

0

Вы не инициализировать

dataRequest 

Перед вызовом

dataRequest.downloadData { ... } 

вы должны добавить

dataRequest = DataClass() 

Так вот почему она возвращает ноль значение

+0

Но если я вызываю dataRequest = DataClass(), мне требуется вернуть init. Адрес пуст, но прежде чем я вызову downloadData. –

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