Попытка инициализировать структуру с помощью self дает ошибку.Как правильно это сделать? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть структура сетевого менеджера.Я пытаюсь инициализировать его в моем главном UIViewController, но это не удается.

struct NetworkManager {
    static var enviroment: NetworkEnviroment = .production
    static var apiKey = ""
    private let mainApiRouter = Router<MainApi>()

    func login(username: String, pass: String, completion:@escaping(_ product:User?, _ err: String?) ->()){
        mainApiRouter.request(.login(username: username, password: pass)) { (data, resp, err) in
            if err != nil {
                completion(nil, "Please check your network connection")
            } else {
                if let reponse = resp as? HTTPURLResponse {
                    let result = handelNetworkResponse(reponse)
                    switch result {
                    case .success:
                        guard let responseData = data else {
                            completion(nil, NetworkResponse.noData.rawValue)
                            return
                        }
                        do {
                            let apiResponse = try JSONDecoder().decode(UserData.self, from: responseData)
                            if apiResponse.data != nil {
                                completion(apiResponse.data, nil)
                            } else {
                                completion(nil, "User login failed")
                            }
                        }catch(let error) {
                            completion(nil, "\(error.localizedDescription)")
                        }
                    case .failure(let failureError):
                        completion(nil, failureError)
                    }
                }
            }
        }
    }
}

Тогда я инициализирую его в контроллере представления, чтобы иметь возможность использовать функцию входа в системув структуре сетевого менеджера.И когда я вызываю кодировщик super.init, сетевой менеджер равен нулю.

class LoginViewController: UIViewController {
    var networkManager: NetworkManager!

    init(networkManager: NetworkManager) {
        super.init(nibName: nil, bundle: nil)
        self.networkManager = networkManager
    }

    required init?(coder aDecoder: NSCoder) {
        // super.init(coder: aDecoder)
        fatalError("init(coder:) has not been implemented")
    }
}

1 Ответ

0 голосов
/ 01 октября 2018

Ваша проблема в том, что вы пытаетесь загрузить этот контроллер представления из раскадровки, но вы не реализовали init(coder:), который раскадровка использует для инициализации представлений, созданных в раскадровке.Если вы удалите fatalError и используете super.init(coder: aDecoder), тогда ваш контроллер представления будет загружен успешно, но код, который вы используете для инициализации вашего сетевого менеджера, никогда не будет вызван, потому что раскадровка не вызывает этот инициализатор при загрузке вашего контроллера представления - выпридется переместить этот код куда-нибудь еще.

...