2017-02-06 3 views
0

У меня есть класс Swift Test со следующим инициализатором.Ошибка с переменным назначением в Swift

import Foundation 

class Test { 
    var x: Int 

    var response: [String: AnyObject] 

    init(_ x: Int) { 
     self.x = x 

     self.response = [String: AnyObject]() 

     self.y(x) 
    } 
} 

Внутри Test у меня также есть следующий способ.

func y(_ x: Int) { 
    // This is a task with a completion handler of type (_, _, _) -> Void 
    let ... = ...(with: ..., completionHandler: {() in 
     do { 
      // The type of z is [String: AnyObject] 
      let z = ... 
      self.response = z 
     } catch { 
      return 
     } 
    }) 

Вызов y предполагается перераспределить z к self.response, но self.response является постоянно пустой словарь.

Я что-то не хватает?

+0

Когда ваше завершениеHandler называется async, 'self' все еще существует? Кроме того, где вы проверили свой автоответ., Так как completeHandler автоматически 'escaping' – antonio081014

+0

Ваша функция y не ждет завершения обработчика завершения. Он возвращается немедленно, и поэтому Test.init() завершается до того, как будет установлено self.response. Вы также должны передать слабую ссылку на себя в обработчик завершения. – onnoweb

+0

@onnoweb Если я изменяю 'completeHandler: {() в' to 'completeHandler: {[weak self]() in' и' self.response = z' для 'self? .Response = z',' self.response' все еще пуст. – Angelo

ответ

0

Хотя этот способ кажется чем-то, что вы, возможно, захотите пересмотреть (и я собираюсь указать вам на этот хороший ответ по аналогичному вопросу: https://stackoverflow.com/a/12797624/2617369), как бы я сделал это с помощью комбинации добавления дополнения к вашему y способа и диспетчерские группы, как это:

(Это скоро 3, потому что у меня нет предыдущей версии IDE, чтобы показать вам в 2.3, но это не должно сильно отличаться):

class Test { 
    var x: Int 

var response: [String: Any] 

init(_ x: Int) { 
    self.x = x 

    self.response = [String: Any]() 

    let group = DispatchGroup() 
    group.enter() 
    self.y(x) { (result) in 
     self.response = result 
     group.leave() 
    } 

    group.wait() 
} 

func y(_ x: Int, completion:@escaping (([String:Any])->())) { 
    // This is a task with a completion handler of type (_, _, _) -> Void 
    let ... = ...(with: ..., completionHandler: {() in 
     do { 
     // The type of z is [String: Any] 
      let z = ... 
      completion(z); 
     } catch { 
     return 
     } 
    } 
} 
+0

Это ответило на мой вопрос и решило мою проблему. Спасибо! – Angelo

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